Мне нужно немного помощи здесь. Я кодировал какой-то сайт с помощью системы «логин» и пытаюсь предотвратить инъекции SQL. Все работает просто отлично без этой цепочки. Когда я добавляю в mysql_real_escape_string () я не могу войти в свой сайт больше, и это раздражает.
Я понятия не имел, что должно быть не так, пытался решить проблему, но ничего не нашел. Итак, у меня есть форма, которая отправляет информацию о пользователе через $ _POST [‘user’] и $ _POST [‘pass’] в check.php. В check.php у меня есть код, чтобы проверить, равен ли user и pass пользователю и pass в БД MySQL.
<?php
include ('mysql.php'); // includes mysql connection
if(isset($_POST['user']) && isset($_POST['pass'])) {
$user = mysql_real_escape_string($_POST['user']);
$pass = mysql_real_escape_string($_POST['pass']);
$row = mysql_fetch_row(mysql_query("SELECT * FROM users WHERE username = '$user'"));
if(($user == $row[1]) and ($pass == $row[2])) {
setcookie("user",$user,time() + 3600,"/");
header('location: secret.php');
} else {
header('location: index.php');
};
};
Имена пользователей и пароли содержат только буквы и цифры, и я знаю, что правильно набираю имя пользователя и пароль.
Если имена пользователей и пароли содержат только буквенно-цифровые символы, попробуйте использовать
ctype_alnum (строка $ text) так что вы просто проверяете, являются ли $ user и $ pass только буквенно-цифровыми символами. Если они верны (если они вернули true), вам не нужно их дезинфицировать.
Кстати, теперь вы должны использовать
mysqli_real_escape_string вместо mysql_real_escape_string!
MySQL функции * устарели.
Надеюсь это поможет
Посмотрите на этот похожий вопрос, который был решен:
http://forums.phpfreaks.com/topic/68338-solved-cant-login-using-mysql-real-escape-string/
Редактировать: Кроме того, комментарий Фред-III-обеспечил вам хороший метод для отладки вашего кода.
Вам нужно только использовать mysql_real_escape_string
на значения, которые будут включены в текст SQL.
например
$user = $_POST['user'];
$pass = $_POST['pass'];
$sql = "SELECT * FROM users WHERE username = '" . mysql_real_escape_string($user) . "'";
... mysql_query($sql) ...
Позже в вашем коде вы сравниваете содержимое $user
к чему-то еще. Если $user
содержит возвращаемое значение из mysql_real_escape_string
то, что вы сравниваете это должно также быть эквивалентно «экранированным» значением.
В качестве примера рассмотрим:
$bar = mysql_real_escape_string($foo);
if ( $bar == $foo ) {
В зависимости от стоимости $foo
строка хранится в $bar
не может быть равным
Значение, возвращаемое из mysql_real_escape_string
«экранирован», поэтому его можно включить в текст SQL.
Дополнительные примечания:
Хранить пароли в виде простого текста — очень плохая идея.
Не проверять ошибки, возвращенные из mysql_query
плохая идея
Использование не рекомендуется mysql
интерфейс, когда две подходящие замены (mysqli
а также PDO
) есть плохая идея. Особенно, когда обе замены поддерживают готовые заявления с связывать заполнители.
С помощью *
в списке SELECT, а затем ссылки на столбцы, возвращаемые по положению столбцов в наборе результатов, также являются плохой идеей. Рекомендуется перечислить конкретные столбцы, которые вы хотите вернуть.