2012-07-18 82 views
3

使用參數,而不是直接在查詢字符串將值做是爲了防止SQL注入攻擊,應始終是doneSQL注入的Symfony /原則

... WHERE p.name > :name ... 
->setParameter('name', 'edouardo') 

這是否意味着,如果我們使用這樣的參數,我們將始終受到SQL注入的保護?在使用表格(FOS註冊表格)時,我將<b>eduardo</b>代替,並將其用標籤持久保存到數據庫中。我真的不明白爲什麼使用參數會阻止SQL注入...

爲什麼這些標記會像這樣持續存在數據庫中?有沒有辦法通過使用Symfony的驗證組件來刪除標籤?

在將數據保存在Symfony中的數據庫之前,我們應該使用一般的提示或方法嗎?

+1

你在哪看到'eduardo'中的SQL? – greg0ire 2012-07-18 11:47:02

回答

9

what's SQL injection開始閱讀。

當SQL將值添加到查詢中時,會發生SQL注入攻擊。結果查詢執行了其他意圖執行的其他內容。

實施例將使用edouardo '或 '1'=' 1爲這將導致一個值:

WHERE p.name > 'edouardo' OR '1'='1' 

(這樣的條件始終爲真)。

「< b> eduardo </b>」是一個完全有效的值。在某些情況下,您會希望將其保存爲submited(例如內容管理系統)。當你將它從數據庫中取出並直接輸出時,它當然會破壞你的HTML。這應該由你的模板引擎解決(小枝會自動轉義它)。

如果您希望在將數據從表單傳遞到實體前使用data transformers

+0

+1爲數據變換器位 – greg0ire 2012-07-18 12:09:02

+0

謝謝Jakub,我現在看到2的區別。非常感謝。 – Mick 2012-07-18 12:10:17

6

如果您在創建請求時使用參數而不是串聯,則該程序能夠將SQL關鍵字和值分開。因此,它可以安全地轉義可能包含惡意SQL代碼的值,以便這種惡意不會被執行,而是存儲在字段中,就像它應該那樣。

HTML代碼注入是另一個問題,它與數據庫無關。顯示該值時,通過使用自動輸出轉義解決此問題,該轉義將顯示<b>eduardo</b>而不是eduardo。這樣,任何惡意的js/html代碼都不會被解釋:它會被顯示。

+0

感謝gregoire,現在一切都變得有意義 – Mick 2012-07-18 12:08:41