Представьте себе динамический SQL-запрос
sqlQuery='SELECT * FROM custTable WHERE User=' + Username + ' AND
Pass=' + password
, поэтому простая инъекция sql будет состоять в том, чтобы просто ввести имя пользователя как ' OR
1=1--
. Это фактически сделает запрос sql:
* 1007.*
Это говорит, что выберите всех клиентов, где их имя пользователя пусто ('') или 1 = 1, что является логическим значением, равным true.Затем он использует -, чтобы закомментировать оставшуюся часть запроса.Так что это будет просто распечатывать всю таблицу клиентов или делать с ней все, что вы хотите, при входе в систему она будет входить с привилегиями первого пользователя, которым часто может быть администратор.
Теперь параметризованные запросы делаютэто иначе, с кодом вроде:
sqlQuery='SELECT * FROM custTable WHERE User=? AND Pass=?'
parameters.add ("Пользователь", имя пользователя) parameters.add ("Пароль", пароль)
, где имя пользователя и пароль являются переменными, указывающими насоответствующее введенное имя пользователя и пароль
Теперь вы можете подумать, что это ничего не меняет.Конечно, вы все еще можете просто вставить в поле имени пользователя что-то вроде Nobody OR 1 = 1 '-, эффективно сделав запрос:
sqlQuery='SELECT * FROM custTable WHERE User=Nobody OR 1=1'-- AND
Pass=?'
И это может показаться действительным аргументом.Но вы были бы не правы.
Способ работы параметризованных запросов заключается в том, что sqlQuery отправляется как запрос, и база данных точно знает, что будет делать этот запрос, и только тогда она будет вставлять имя пользователя и пароли.просто как ценности.Это означает, что они не могут повлиять на запрос, потому что база данных уже знает, что будет делать запрос.Таким образом, в этом случае он будет искать имя пользователя "Nobody OR 1=1'--"
и пустой пароль, который должен быть ложным.