Как этот код PDO защищает от SQL-инъекций?

Поэтому я изучал всю эту вещь PDO, и я читал этот учебник по блогам, когда сталкивался с этим кодом, и объяснение заключалось в том, что если я использую PDO с привязкой данных, пользователи не смогут добавлять SQL-инъекции. Как это работает?

 # no placeholders - созрел для SQL Injection!  
 $ STH = $ DBH -> ("INSERT INTO people (имя, адр, город)) ($ name, $ addr, $ city)");  

 # неназванные заполнители  
 $ STH = $ DBH -> ("INSERT INTO folks (name, addr, city) values ​​(?,?,?); 

 # с именем заполнители 
 $ STH = $ DBH -> ("INSERT INTO folks (name, addr, city) value (: name,: addr,: city)");  

Вот ссылка на веб-сайт, который я получил от вас, вы хотите прочитать его для справки. http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

(Во 2-й строке есть ошибка, строка не завершена, добавьте "); до конца, и все должно быть в порядке. Это также на странице, с которой вы связались, так что это их вина. необходимо указать значения, которые будут заменять вопросительные знаки, а затем фактически запустить запрос, прежде чем вы получите какие-либо результаты.)

В любом случае, к делу. PDO ищет ? или :name отметки :name и заменяет их (в порядке или по имени, соответственно) с указанными вами значениями. Когда значения вставляются в строку запроса, они сначала обрабатываются, чтобы избежать всего, что может быть использовано для инъекционных атак.

Это похоже на использование mysql_real_escape_string() (или более слабых addslashes() ) значения, прежде чем использовать его в запросе, но PDO делает это автоматически и лучше на нем.

PDO делает гораздо больше за кулисами, чем просто заменяет ваши заполнители параметризованными данными. Двигатели базы данных могут принимать запросы в форме, подобной «вот ваше заявление, вот заполнители, и я расскажу вам, что происходит в каждом заполнителе». Механизм SQL знает, что параметры НЕ являются сырым кодом, который должен выполняться, но рассматриваться как данные.

Поскольку PDO знает, как правильно вставлять значения в запрос, когда вы используете подготовленный оператор.

Когда вы привязываете значение к заполнителю, например

 $sth->bindValue(':name', $name, PDO::PARAM_STR); 

PDO позаботится о том, чтобы убежать от него должным образом. Таким образом, SQL Injections не будет работать.

Поскольку подготовленный оператор с параметрами связывания – это оператор, в котором анализ запроса уже выполнен, а места для строки или ints могут быть только striongs или int. Никакого нового анализа операторов не производится, поэтому никакие аргументы не могут быть проанализированы как нечто, связанное с SQL, и никогда не будут анализироваться как SQL.