Возможно ли SQL-внедрение с mysql_real_escape_string, когда переменные в запросе не имеют кавычек вокруг них? - PullRequest
3 голосов
/ 26 августа 2011

Возьмем, к примеру, это

$username = mysql_real_escape_string($_GET['username']);
$password = mysql_real_escape_string($_GET['password']);
$sql = "SELECT * FROM users WHERE username = $username AND password = $password";

Если вокруг $ username и $ password нет кавычек, возможна ли инъекция?

Ответы [ 3 ]

3 голосов
/ 26 августа 2011

Если вокруг $ username и $ password нет кавычек, возможна ли инъекция?

Да. mysql_real_escape_string() запрещает выход только из кавычек в строке.

Без окружающих кавычек, mysql_real_escape_string() бесполезен.

1 голос
/ 26 августа 2011

Да. Тривиально, введите имя пользователя в качестве имени пользователя и пароль в качестве пароля. Поздравляем, вы в. Это потому, что это расширяется до:

$sql = "SELECT * FROM users WHERE username = username AND password = password";

Он выберет любую строку, в которой столбец username равен столбцу username (то же самое для пароля).

Конечно, этот код также не подходит для обычных входов в систему, поэтому его нужно перехватить довольно быстро. Если вы используете любое имя пользователя или пароль, который не является структурой базы данных (столбец, вызов функции и т. Д.), Произойдет сбой.

0 голосов
/ 26 августа 2011

Без кавычек представленные пользователем данные будут рассматриваться как ссылки на поля и / или недействительный SQL.

Рассмотрим имя пользователя username. Правильный запрос будет:

SELECT ... FROM ... WHERE username='username'

и совпадают только в том случае, если действительно существует пользователь с именем «username».

Без кавычек становится:

SELECT ... FROM ... WHERE username=username

, который будет соответствовать ВСЕМ ненулевым записям в таблице.

Теперь рассмотрим имя пользователя, состоящее из двух частей: John doe

SELECT ... FROM ... WHERE username=John doe

Сервер БД попытается сравнить поле имени пользователя с именем поля «Джон», которого, скорее всего, не существует. Кроме того, в нем есть «doe», который не является ни именем поля, ни ключевым словом SQL, так и синтаксической ошибкой.

Теперь рассмотрим имя пользователя: 1 or 1=1

SELECT ... FROM ... WHERE username=1 or 1=1

снова, это ВСЕГДА вернет true и совпадет со ВСЕМИ строками, потому что "1 = 1" всегда будет true.

mysql_real_escape_string () только гарантирует, что любые данные, которые вы передаете через него, не "сломают" ЗАПРАВИЛЬНО КОНСТРУКТИВНЫЙ запрос. Если запрос, в который вы вставляете экранированные данные, НЕ составлен должным образом, все ставки отменены.

...