Подготовленные утверждения и SQL-инъекции второго порядка

Я где-то читал, что использование подготовленных операторов в 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. И это должно применяться к любым данным независимо от их происхождения или считается ли оно «доверенным» или «ненадежным», просто для того, чтобы данные интерпретировались как предназначенные.