Как этот код PDO защищает от SQL-инъекций? - PullRequest
4 голосов
/ 02 августа 2011

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

# no placeholders - ripe for SQL Injection!  
$STH = $DBH->("INSERT INTO folks (name, addr, city) values ($name, $addr, $city)");  

# unnamed placeholders  
$STH = $DBH->("INSERT INTO folks (name, addr, city) values (?, ?, ?); 

# named placeholders 
$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/

Ответы [ 5 ]

4 голосов
/ 02 августа 2011

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

3 голосов
/ 02 августа 2011

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

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

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

0 голосов
/ 02 августа 2011

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

0 голосов
/ 02 августа 2011

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

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

PDO позаботится о его правильном экранировании.Таким образом, SQL-инъекции не будут работать.

0 голосов
/ 02 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...