Поэтому я изучал всю эту вещь 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.