Я где-то читал, что использование подготовленных операторов в PDO делает ваше приложение только иммунным к инъекциям SQL первого порядка, но не полностью невосприимчиво к инъекциям второго порядка.
Мой вопрос: если мы использовали подготовленные операторы во всех запросах, в которых выполнялись запросы SELECT, а не только в запросе INSERT, то как можно сделать инъекцию SQL-кода второго порядка?
Например, в следующих запросах нет возможности для инъекции 2-го порядка:
записывать:
INSERT INTO posts (userID,text,date) VALUES(?,?,?)
читать:
SELECT * FROM posts WEHRE userID=?
Удалить:
DELETE FROM posts WHERE userID=?
То, что вы прочитали, – это простой мусор. Кто-то, кто написал это, просто понятия не имеет.
Вы должны использовать подготовленные инструкции не для запроса, а для данных. Каждый раз, когда вам нужно добавить переменную в запрос, вы должны сделать ее только с помощью заполнителя. Таким образом, ваша теория разделения запросов не имеет смысла: не имеет значения, выбрана ли она SELECT или ALTER или GRANT или что-то еще. Единственное, что имеет значение – если какая-либо переменная входит в запрос или нет.
Поскольку большинство людей проповедуют «пользователь злой» и «не доверяют пользовательскому вводу», можно получить впечатление, что, как только данные в базе данных будут «доверенными».
Но SQL-инъекции не связаны с надежными и ненадежными данными. SQL-инъекция – это неспособность убедиться, что оператор SQL интерпретируется как предназначенный.
И именно здесь готовятся инструкции / параметризация, поскольку это метод обеспечения того, чтобы параметры интерпретировались как предназначенные, т. Е. Как данные, а не как код SQL. И это должно применяться к любым данным независимо от их происхождения или считается ли оно «доверенным» или «ненадежным», просто для того, чтобы данные интерпретировались как предназначенные.