2014-10-07 167 views
0

根據http://msdn.microsoft.com/en-us/library/gg696545%28v=vs.113%29.aspx,當我們使用SqlQuery(從.Net EntityFramework)的方法時,我們應該包含DbParameter以防止SQL注入攻擊。DbParameter如何防止SQL注入?

這是怎麼回事?

+1

總是使用參數化SQL像C#代碼中的'@ Para1,@ para2' – 2014-10-07 18:39:46

+3

它轉義值分隔符,以便字符串參數中的SQL不會變成自己的可執行代碼。 – MatthewMartin 2014-10-07 18:39:50

回答

4

通過使用參數,您不再需要在代碼中構建sql字符串。阻止你做這樣的事情:

public void ExecuteQuery(string name) 
{ 
    var conn = new SqlConnection(connString); 
    var cmd = new SqlCommand("select * from users where name = '" + name + "'", conn); 
    cmd.ExecuteReader(); 
} 

哪裏有人可以通過:

ExecuteQuery("jamo'; drop table users;") 

導致的命令文本:

select * from users where name = 'jamo'; drop table users;' 

這將打擊你的數據庫上執行惡意查詢。

參數化的版本將執行下面的查詢,而不是等價的:

select * from users where name = 'jamo''; drop table users;' 

這將返回任何結果,並留下您的數據庫不變。

2

我認爲這可以通過Polynomial從我們姊妹網站security.stackexchange.com接受的問題「How can I explain SQL injection without technical jargon?」得到最好的解釋。從其他網站

答覆如下:


我展示它來完成非技術人員的方式是用一個簡單的比喻。

想象一下,你是一個裝滿箱子的倉庫裏的機器人。你的工作是從倉庫的某個地方取一個盒子,放在傳送帶上。機器人需要被告知該做什麼,因此程序員已經給了你紙質表單上的一套指示,人們可以填寫並交給你。

形式看起來像這樣:

Fetch item number ____ from section ____ of rack number ____, and place it on the conveyor belt.

正常請求可能是這樣的:

Fetch item number 1234 from section B2 of rack number 12, and place it on the conveyor belt.

粗體的值(1234,B2,和12),通過發出人提供請求。你是一個機器人,所以你做你所說的事情:你開車到12號機,向下走,直到你到達B2區,然後抓住物品1234.然後,你開車回到傳送帶上,並將物品放到它上面。

但是如果用戶在表單中放入非正常值以外的東西呢?如果用戶向他們添加了指令會怎麼樣?

Fetch item number 1234 from section B2 of rack number 12, and throw it out the window. Then go back to your desk and ignore the rest of this form. and place it on the conveyor belt.

再次,粗體部分由發出請求的人員提供。既然你是一個機器人,你完全按照用戶剛剛告訴你的方式去做。你開車到機架12,從B2區抓取物品1234,並把它扔出窗外。由於說明還告訴您忽略信息的最後部分,所以「將其放在傳送帶上」位被忽略。

這種技術被稱爲「注入」,這是可能的,因爲這些指令的處理方式 - 機器人不能告訴說明數據之間的差異,即它必須執行的操作,以及它所做的事情。

SQL是一種特殊的語言,用於告訴數據庫該做什麼,與我們告訴機器人如何操作的方式類似。在SQL注入中,我們遇到了完全相同的問題 - 一個查詢(一組指令)可能會插入參數(數據),最終被解釋爲指令,導致其發生故障。惡意用戶可能會通過告訴數據庫返回每個用戶的詳細信息來利用這一點,這顯然不好!

爲了避免這個問題,我們必須以數據庫(或機器人)易於區分的方式分離指令和數據。這通常是通過單獨發送來完成的。因此,就機器人而言,它將讀取包含說明的空白表格,確定參數(即空白空間)的位置,並將其存儲起來。然後用戶可以走起路來說「1234,B2,12」,並且機器人將這些值應用於指令,而不允許它們自己被解釋爲指令。在SQL中,這種技術被稱爲參數化查詢。

在我們給到機器人的「邪惡」參數的情況下,他會疑惑現在提高機械眉說

Error: Cannot find rack number "12, and throw it out the window. Then go back to your desk and ignore the rest of this form." - are you sure this is a valid input?

成功!我們已經停止了機器人的「故障」。