Вы используете 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!
Вот пример кода, который не работает:
Нерабочий код
$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 позволяет выполнять два или более операторов за один раз.