2016-04-01 3 views
1

Я читал о SQL-инъекции, поэтому я пробовал его с моим сайтом и, конечно же, работал. Я знаю, что решение является параметризованным запросом, и я также знаю, что есть много примеров но никто из них не упоминает ту часть, где мы подключаемся к базе данных. Так вот часть моего логина страницы PHP код:Параметрированные запросы в PHP с подключением MySQL

$userName = $_POST["username"]; 
$userPass = $_POST["password"]; 

$query = "SELECT * FROM users WHERE username = '$userName' AND password = '$userPass'"; 

$result = mysqli_query($dbc, $query); //$dbc is for MySQL connection: $dbc = @mysqli_connect($dbhost, $dbuser, $dbpass, $db) 

$row = mysqli_fetch_array($result); 

if(!$row){ 
    echo "No existing user or wrong password."; 
} 

Я искал решение в течение длительного времени, но я просто не мог понять, как я мог заставить его работать в параметризованном образом. Не могли бы вы помочь мне, как я должен завершить свой код, чтобы предотвратить SQL-инъекцию?

+1

Это подробно объясняется здесь: http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php – Guido

+0

Посмотрите, как сделать инструкции подготовки на PHP, которые предотвратит внедрение sql: http://www.w3schools.com/php/php_mysql_prepared_statements.asp – Erick

ответ

3

Держи

$stmt = mysqli_prepare($dbc, "SELECT * FROM users WHERE username = ? AND password = ?"); 
mysqli_stmt_bind_param($stmt, "s", $userName); 
mysqli_stmt_bind_param($stmt, "s", $userPass); 
mysqli_stmt_execute($stmt); 
$row = mysqli_stmt_fetch($stmt); 

Documentation

Как примечание стороны я рекомендовал бы, чтобы зашифровать пароль или лучше использовать хэш для безопасности, это не хорошо, чтобы сохранить пароль в виде простого текста

+0

Благодарим вас за ответ. Я скопировал его в свой код, теперь он работает с правильными данными, но он все еще принимает «или» = «вещь:/ –

+0

@ MárkVégh, конечно, он все еще принимает его - он есть на входе. Однако он не может быть выполнен! В этом суть подготовленных заявлений. Данные в заполнителях рассматриваются только как текст. –

+0

О, я вижу, но что я могу сделать, чтобы предотвратить такую ​​инъекцию? Теперь любой может войти в систему, просто введя его в поле имени пользователя и пароля:/ –

-1

использования :

$userPass = mysqli_real_escape_string($mysqli,$_POST["password"]); 

Этот блок имеет значение '' или '=' вещь :), где $ mysqli - ваша строка соединения c.

Смежные вопросы