Когда использовать mysql_real_escape_string () - PullRequest
1 голос
/ 05 июня 2011

Когда правильное время использовать mysql_real_escape_string?

Должен ли я использовать его при использовании isset (mysql_escape_string ($ _ GET ['param'])),

Должен ли я использоватьэто когда я использую $ foo = mysql_real_escape_string ($ _ GET ['bar']);

Спасибо

Ответы [ 4 ]

1 голос
/ 05 июня 2011

Вы должны вызывать эту функцию при построении запросов SQL со строковыми литералами.
Вы не должны вызывать ее где-либо еще.

Смысл вызова этой функции состоит в том, чтобы предотвратить выполнение SQL, например SELECT * FROM Students WHERE Name = 'Robert'); DROP TABLE Students;--'.
mysql_real_escape_string экранирует символ ', поэтому строка зла полностью обрабатывается как строка.

0 голосов
/ 05 июня 2011

Вы используете mysql_real_escape_string всякий раз, когда у вас есть ввод от пользователя, которого вы хотите использовать в запросе.

Вот как это использовать:

$user = mysql_real_escape_string('$_GET['user']);
$password = MD5($user.$_GET['password']);
$query = "SELECT * FROM users WHERE user = '$user' AND password = '$password' ";
//the quotes are vital  !!                 ^     ^  or you will not be safe!

Вот пример кода, который не работает:

enter image description here Нерабочий код

$user = mysql_real_escape_string('$_GET['user']);
$password = MD5($user.$_GET['password']);
$query = "SELECT * FROM users WHERE user = $user AND password = '$password' ";

В этом примере я могу войти в вашу систему, введя любой пароль и
user or (1=1) --. Это сделает запрос следующим:

SELECT * FROM users WHERE user = user or (1=1) --  AND password = '$password

И одобрит все входы в систему, потому что пароль никогда не проверяется.

При использовании mysql_query вы можете одновременно выполнять только один SQL-оператор, поэтому:

$query = "SELECT * FROM a; DELETE FROM a WHERE (1=1)"
mysql_query($query);

приведет к ошибке, потому что не может быть частью после ;.

Однако этот код будет работать:

Danger

$query = "SELECT * FROM a; DELETE FROM a WHERE (1=1)"
mysqli_query($query);

Поскольку улучшенный mysqli_query позволяет выполнять два или более операторов за один раз.

0 голосов
/ 05 июня 2011

Вы должны использовать это всякий раз, когда вы вставляете данные в запрос к базе данных (данные POST / GET), но не если вам просто нужно проверить данные.

0 голосов
/ 05 июня 2011

Вы должны использовать это всякий раз, когда вы не доверяете данным, которые вы вставляете в запрос MySQL, чтобы предотвратить инъекции SQL.Например все данные пользователя формы.В вашем первом примере: нет.Второй пример: да, если вы собираетесь использовать переменную $ foo в запросе.

...