2013-08-19 26 views
0

因此,我閱讀了一些關於綁定的文章,並且誠實,儘管我明白了掙扎着看到真正價值的好處。好處很明顯,但我無法擺脫真實世界的例子。綁定值如何在PDO和PHP中工作

有人可以告訴我一個簡單的查詢,用戶可以輸入一個值,然後在SQL注入發生的地方提交它,然後告訴我綁定是如何避免的。這應該使得它非常清楚發生了什麼。

對於從標準MySql語句過渡的PDO,我顯然是新手。

假設只有在用戶輸入涉及時才需要它,否則我們可以跳過綁定?

回答

1

看看我的介紹SQL Injection Myths and Fallacies

或觀看我的網絡研討會錄像:http://www.percona.com/webinars/2012-07-25-sql-injection-myths-and-fallacies(免費,但需要註冊)。

我展示了幾個例子,比如下面:

假設你有一個頁面,允許用戶更改他們的密碼,並打算的用戶使用URL這樣才能訪問它:

HTTP://example.com/changepass.php?acctid=1234 &通= XYZZY

(當然,他們會通常使用POST請求,但對於簡單的圖示的目的,讓我們一起去這個GET格式)

在腳本該頁面中,你有一個SQL更新語句是這樣的:

UPDATE Accounts 
SET password = SHA2('$password')
WHERE account_id = $account_id 

現在,如果惡意用戶設置的參數巧妙,像這樣:

HTTP:/ /example.com/changepass.php?acctid= 1234 OR TRUE &通= XYZZY '),管理員=(' 1

那麼你的SQL最終會運行此語句:

UPDATE帳戶SET PASSWORD = SHA2( 'XYZZY '),管理員=(' 1')
WHERE ACCOUNT_ID = 1234或TRUE

將設置密碼,但設置表中的另一列授予用戶管理員權限。而WHERE子句中的注入將更改應用於所有用戶在你的網站,而不僅僅是誰是登錄的用戶

的參數值是:一個參數是總是視爲一個價值SQL表達式。

也就是說,即使您爲該參數傳遞的字符串碰巧包含利用注入的SQL語法,但使用參數意味着它不能被解釋爲除單個字符串或數值之外的任何其他內容。所以它不能終止字符串,或者包含括號或者其他任何會修改你的SQL語句的語法或語義的東西。

因此,通過使用綁定參數,它更像是這樣的:

UPDATE帳戶SET PASSWORD = SHA2(」 XYZZY \ '),管理員=(\' 1 ')
WHERE ACCOUNT_ID =' 1234或真'

,其中的密碼可能看起來很有趣,用空格和引號內,但它不會改變你的SQL語句的含義。而WHERE子句將使用該字符串的整數值,這將僅僅是1234


回覆您的評論:

我沒有跟蹤代碼的每一行,但我相信它使SQL語句字符串與每個執行階段的值分開。在某些時候,SQL被解析,然後以某種內部方式表示(不可讀的文本);那麼參數值被合併到這裏,但它們被強制爲一個單一的句法元素。問題是,在之後,它們合併爲查詢已被解析,因此參數值無法更改語法。

一個例外:通用查詢日誌將值插入到原始SQL字符串中,以便在給定執行中記錄與其參數相結合的查詢。但是這個組合的查詢字符串不會被執行。

+0

感謝您的詳細解釋,我確實經歷了大部分幻燈片,但我時間不多,只是瀏覽了它們。在後面的綁定參數示例中,背景中實際發生了什麼。 它基本上是運行相當於mysql_real_escape還是它也在做其他事情,我仍然不明白佔位符部分做什麼,我的意思是如果在這個例子中的佔位符是:密碼那麼它仍然會通過xyzzy的值'),admin =('1它只是做了一堆轉義函數,還是有更多的綁定過程? – user1547410