2011-08-02 56 views
4

所以我正在研究這整個PDO的事情,當我遇到這個代碼時,我正在閱讀這篇博客教程,解釋是如果我使用帶數據綁定的PDO - 用戶將無法添加SQL注入。這個怎麼用?此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)"); 

這裏是網站的鏈接我從incase那裏得到它你想閱讀它以供參考。 http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

+0

他們只是非常草率的例子。他們甚至不會跑。他們缺少' - > query'和' - > prepare'方法調用等。 –

+0

因爲命令和數據是分開傳輸的。 (對於那些支持它的後端/啓用時)。 – mario

回答

3

(第二行有一個錯誤,字符串沒有終止,最後加上");,你應該沒問題,它也在你鏈接的頁面上,所以它是錯誤的。當然還需要提供替代問號的值,然後在得到任何結果之前實際運行查詢。)

無論如何,要點。 PDO查找?:name標記,並用您指定的值替換它們(按順序或按名稱分別)。當這些值被插入到查詢字符串中時,它們首先被處理以轉義任何可用於注入攻擊的東西。

這與使用mysql_real_escape_string()(或較弱的addslashes())在查詢中使用它之前的值類似,但PDO自動執行並且效果更好。

0

由於PDO知道如何在使用預準備語句時正確地將值插入到查詢中。

4

PDO在幕後比做參數化數據替換佔位符要多得多。數據庫引擎可以以類似於「這裏是你的語句,這裏是佔位符,並且我會告訴你每個佔位符中發生了什麼」的形式接受查詢。 SQL引擎知道參數不是要被執行的原始代碼,而是僅被視爲數據。

+3

...並且如果數據庫不支持那樣的任何事情,那麼該數據庫的PDO庫將知道如何恰當地轉義數據本身。 – Quentin

+1

+1。這裏非常重要。在幾乎所有情況下,替換都是由數據庫引擎自己完成的。這意味着永遠不會有我們最終得到類似於mysql_escape_string VS的情況。 mysql_real_escape_string VS. mysql_escape_string_i_mean_it_this_time。 – Kibbee

0

當您將值綁定到佔位符時,例如

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

PDO將負責妥善轉移它。因此,SQL注入將不起作用。

0

因爲帶有綁定參數的預處理語句是查詢分析已完成的語句,並且字符串或整數的位置只能是striongs或整數。沒有對語句進行新的分析,因此沒有給出的參數可以分析爲與SQL有關的內容,並且永遠不會被分析爲SQL。