Итак, что-то, о чем мне было интересно во время работы над текущим проектом, – это если простое сравнение переменных подвержено атакам типа «SQL Injection», когда одна из переменных вводится пользователем.
Моя базовая функция входа в систему работает, беря предоставленное пользователем имя пользователя и используя подготовленный оператор, чтобы найти его в таблице профилей. Если запись найдена, profileID
затем извлекается из записи и используется для поиска пароля пользователя в другой таблице разрешений. Если запрос THAT будет успешным, тогда пароль, предоставленный пользователем, будет ===
против полученного пароля из базы данных.
Поэтому мой вопрос заключается в том, что этот последний шаг представляет собой риск? Я попытался «взломать его сам, ставя его значения, как a' == 'a' || 'a
a' == 'a' || 'a
в попытке ложно вызвать $pass === $checkPermRow['pass']
но он, похоже, ничего не делает. Я в безопасности?
Если вы используете подготовленные операторы и передаете входные данные в качестве параметров в подготовленный оператор, вы можете быть уверены в том, что SQL-инъекции. Параметры должны обрабатываться должным образом, и не должно быть возможным, чтобы фрагменты переданных параметров интерпретировались как код SQL вместо данных. Это точная точка параметризации, т. Е. Разделение кода и параметров данных.
Поэтому не следует вводить что-либо в запрос. Однако вы не должны хранить пароли в открытом тексте, но в необратимой форме как хэш, используя соответствующую хэш-функцию.
Что касается вашего вопроса, возможна ли инъекция в самом PHP: Да, инъекция кода может произойти в любом коде, который генерируется динамически, поэтому даже в PHP.
Однако вам не нужно просто генерировать код динамически, но также выполнять его. PHP имеет некоторые функции, которые выполняют PHP), например, функция eval
. Однако вы, вероятно, не будете использовать такие конструкции:
if (eval("return '$pass' === '$checkPermRow[pass]';"))
Это было бы уязвимо для инъекции кода PHP и a' == 'a' || 'a
a' == 'a' || 'a
приведет к чему-то вроде:
return 'a' == 'a' || 'a' === 'password from database';