2015-06-20 71 views
2

我很困惑,或者說我很喜歡,sooooooooo與pdo準備的陳述混淆。我知道準備好的聲明是保護數據免受黑客攻擊的最佳方式。PDO準備語句如何幫助防止SQL易受攻擊的語句?

來源:How can prepared statements protect from SQL injection attacks?

我們發送程序到服務器第一

$ DB->準備( 「SELECT * FROM用戶其中id =?」);其中數據是 ,被一個名爲「佔位符」的變量替代。

請注意,非常相同的查詢被髮送到服務器,沒有任何 數據!然後我們發送的第二請求中的數據, 完全從查詢本身分開:

$ DB->執行($的數據);

查詢 -

$query=$db->prepare("SELECT * FROM USERS WHERE username=?"); 
$query->execute(array($tex)); 
$tex=blah; DROP TABLE users;-- 

那麼這將是象 - SELECT * FROM USERS其中username =等等; DROP TABLE用戶; -

如何準備語句將幫助我與上面的這個例子?

如果這個問題含糊不清,我真的很抱歉。任何幫助,將不勝感激。提前致謝。

回答

0

預處理語句處理程序將確保綁定值是始終作爲有效的SQL值/字面(即SQL字符串或數字)和從未爲「原始SQL文本」 。

這就是爲什麼佔位符值不能用作標識符,如列或表名或作爲其他SQL關鍵字;並且不能生成弱點查詢虛擬。當使用

WHERE username='blah''; DROP TABLE users;--' 
      --^ placeholder STILL ensures valid SQL string value is used 

因此,相反,它被視爲如下:

WHERE username='blah; DROP TABLE users;--' 
      --^ placeholder ensures valid SQL string value is used 
      -- (note automatic/implicit addition of SQL quotes) 

甚至與綁定時 '更靠譜' 的數據:

$tex = "blah'; DROP TABLE users;--"; // embedded SQL quote character 

這仍然是安全的佔位符,它是不可能生成易受攻擊的SQL(以這種方式)。

對於SQL Injection查詢的「形狀」(包括關鍵字和標識符,但不包括值)本身必須通過輸入進行更改。


技術上佔位符值也可以(取決於適配器/驅動程序)通過一個單獨的數據信道上發送,因此甚至可能不會出現在原始SQL查詢本身。

但是一個簡單的方法來思考爲什麼佔位符是安全的,或者他們是如何「工作」是:

當使用佔位符適配器確保相當於「SQL真的安全逃生」和適用的報價是總是用於每個綁定文本值 - 因此不可能意外忘記。

+0

你在說,在使用佔位符時,不可能生成易受攻擊的sql。但我想知道的是佔位符如何做那件事?我的意思是 - htmlspecialchars()函數將一些預定義的字符(&,「,',<,>)轉換爲HTML實體,addslashes()函數返回一個帶有預定義字符前面的反斜槓的字符串,就像這些函數一樣,佔位符檢測值是不是 –

+0

**停止**。它沒有這樣的事情,佔位符確保值*是作爲有效的SQL值提供的*,它與HTML或實體沒有任何關係或斜線*佔位符*僅*確保數據正確傳輸*沒有* SQL注入機會*佔位符永遠不會改變實際值*在上面的例子中,我已經展示瞭如何在SQL查詢中使用適當的ANSI)SQL語法 – user2864740

+0

(假設佔位符構建實際的SQL查詢,「方法」將與'mysqli_real_escape_string'或同等方式構成)。 – user2864740