#php #mysql #database #pdo #sql-injection
#php #mysql #База данных #pdo #sql-инъекция
Вопрос:
Я пытаюсь работать с PDO, чтобы сделать мои скрипты более безопасными. У меня есть демо, и поэтому я устанавливаю переменную в это $STH->bindParam(':ip', $ip);
, а затем вызываю ее следующим образом
$DATA = $con->prepare("INSERT INTO users (ip) VALUES (':ip')");
Проблема в том, что по какой-то причине он не попадает в базу данных. Вот мой полный код:
<?php
$host = "localhost";
$dbname = "users";
$user = "root";
$pass = "root";
try{
$con = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
}
catch(PDOException $e){
echo $e->getMessage();
}
function generateRandomString($length = 10) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randomString = '';
for ($i = 0; $i < $length; $i ) {
$randomString .= $characters[rand(0, strlen($characters) - 1)];
}
return $randomString;
}
$ip = generateRandomString().sha1($_SERVER['SERVER_ADDR']).generateRandomString();
$STH->bindParam(':ip', $ip);
$DATA = $con->prepare("INSERT INTO users (ip) VALUES (':ip')");
$DATA->execute();
?>
И да, я понимаю, что это не так, как получить IP-адрес, в-четвертых, я просто играю с PDO и MYSQL.
Комментарии:
1. попробуйте в таком порядке (и без кавычек
:ip
):$DATA = $con->prepare("INSERT INTO users (ip) VALUES (:ip)"); $DATA->bindParam(':ip', $ip); $DATA->execute();
2. Похоже, не сработало @aldanux
3. и чем отличается мой код от echo_me?
Ответ №1:
вы должны указывать параметр binfd после запроса, а не до
$DATA = $con->prepare("INSERT INTO users (ip) VALUES ( :ip )");
$DATA->bindValue(':ip', $ip , PDO::PARAM_STR); // if ip column is string
$DATA->execute();
Комментарии:
1. Он по-прежнему работает без
PDO::PARAM_STR
, этоPDO::PARAM_STR
более безопасный способ? Также отличный и простой ответ2. Я не уверен, прочитали ли вы вопрос в последнем комментарии. Он работает без
PDO::PARAM_STR
,PDO::PARAM_STR
необходим>3. @user302975 когда вы удаляете этот параметр, вы оставляете его на усмотрение PDO для определения типа данных ‘
4. не требуется, но явный тип данных для него не будет вставлен как другой тип.
5. таким образом, вы указываете тип данных .
Ответ №2:
Вы можете привязывать параметры только после подготовки запроса, иначе что вы привязываете?
$ip= generateRandomString().sha1($_SERVER['SERVER_ADDR']).generateRandomString();
$stmt= $con->prepare("INSERT INTO users (ip) VALUES (:ip)");
$stmt->bindParam(':ip', $ip);
$stmt->execute();
В отличие bindValue
от, bindParam
позволяет привязывать до или после инициализации переменной, потому что она использует ссылку на переменную, а не значение, поэтому вам разрешено ставить create $ip
после привязки.
$stmt= $con->prepare("INSERT INTO users (ip) VALUES (:ip)");
$stmt->bindParam(':ip', $ip);
$ip= generateRandomString().sha1($_SERVER['SERVER_ADDR']).generateRandomString();
$stmt->execute();
в этом случае оба будут работать.
Комментарии:
1. Когда я проверяю в БД, я получаю
:ip
в результате, а не фактическую сгенерированную строку…2. @user302975 это потому, что у вас были кавычки вокруг него