О, боже, пожалуйста, скажите мне, что вы делаете какой-то тип mysql_escape_string
или mysql_real_escape_string
или, по крайней мере, addslashes
или addcslashes
для любых $_POST
переменных до того, как вы вставите их в необработанный оператор MySQL?
Я думаю, что самый безопасный способ сделать это:
a) используйте filter_var
или preg_replace
, чтобы избавиться от посторонних символов из $ _POST ['username']
b) SELECT
строка по имени пользователя из MySQL (также захватывает переваренный пароль)
в) сравните версию пароля, переваренного в сообщении от $_POST
, с паролем извлеченной строки (при условии, что вы не оставляете открытый текст пароля) в коде своего приложения, а не в операторе SQL
Если вы делаете это таким образом, есть только 1 возможное место для инъекции (имя пользователя), и это довольно невозможно, когда вы делаете preg_replace( '/\W/', '', $_POST['username'] )
, который удаляет все, что не A-Za-z0-9_- (или изменяется на ваш белый список символов имени пользователя).
Тем не менее, если вы проводите тщательную надлежащую санитарную обработку, на самом деле не имеет значения, где вы проводите сравнение. Тем не менее, теоретически я бы позволил наименьшее возможное взаимодействие с пользовательским вводом и необработанными операторами SQL (т. Е. Только SELECT
по имени пользователя и сравнению за пределами вашей БД).