2017-08-17 46 views
1

我一直在閱讀上的SQL注入攻擊,並在那裏的文章,他們一直在說這句話是容易注入攻擊:SQL注入串聯VS參數

"SELECT * from tblBlah where userId" +userId

但此查詢是不是」

"SELECT * from tblBlah where userId = @userId";

我試圖找出爲什麼是這樣一個交代。他們倆都期待的一個參數。會不會是第一個查詢可以接受來自URL和第二canno參數T'

+0

第二個可能意味着某種形式的_prepared語句_。 – CBroe

+0

我強烈推薦這個[閱讀](http://www.sommarskog.se/dynamic_sql.html#SQL_injection) –

回答

2

在第一個查詢的人的情況下,可以通過以下值userId

= 3; DELETE FROM tblBlah; 

這將是字符串串聯,並會導致下面的SQL語句:

SELECT * from tblBlah where userId= 3; DELETE FROM tblBlah; 

當然這對你的數據庫來說是災難性的。

我認爲在第二個查詢的情況下,數據庫將在內部編譯爲單個SELECT語句。該參數的值將被插入佔位符所在的位置,但僅作爲數據。即便我們嘗試了以下任務:

@userId = '= 3; DELETE FROM tblBlah;'; 

我們最終會與下面的查詢:

SELECT * from tblBlah where userId = '= 3; DELETE FROM tblBlah;'; 

換句話說,我們試圖將代碼注入,但所有我們真正能夠做的是注入一個字符串參數。這可能導致錯誤的查詢觸發,但它不會允許惡意用戶撥打DELETE。實際上,用戶可以無限制地控制執行哪個語句。

這是一個簡單的例子,演示了預處理語句的強大功能。使用預處理語句,在查詢實際運行之前,查詢的一般模板或結構已經編譯完成。語句的部分具有參數佔位符,但不會通過串聯來更改查詢,而只能通過分配定位的值。

+0

謝謝你的詳細解釋。 – Baahubali

1

在第一次查詢時,數據庫不知道它是否有更多條件或查詢的目的是什麼,那麼數據庫將盲目地信任查詢。

第二個數據庫在啓動時會得到查詢,並確切知道你想要做什麼以及查詢應該有多少個參數,如果來自參數的東西改變了初始行爲或者根本不存在,該查詢將不被信任,並會引發錯誤。

我現在將用示例來解釋。

如果你這樣做:

SELECT * FROM table WHERE User=' + User + ' AND Pwd=' + Pass 

有人可以輕鬆地將SQL那裏,只是填充'' AND 1=1--用戶因爲--會評論掉查詢的第二部分和條件將是真實的,那麼它將打印表格數據。

查詢看起來像:

SELECT * FROM table WHERE User='' AND 1=1-- AND Pwd=' + Pass 

現在讓我們用參數做到這一點:

SELECT * FROM custTable WHERE User= @user AND [email protected] 

//Someone filled the userfield with SQL injection: 
@user = "'' AND 1=1--" 
@password = "" 

那麼查詢將如下所示:

查詢看起來是一樣的但工作方式不同,數據庫將處理查詢,獲取@username參數和一個空密碼,那麼它應該是錯誤的。

我會添加它取決於你如何使用SQL參數和你編程的語言,它會或多或少是安全的,但其中最安全的將是使用存儲過程參數化查詢。

+0

在這兩種情況下,查詢都是「可信」,但在第二種情況下,由於該參數可能會造成很小的損失。 –

+0

@TimBiegeleisen你是完全正確的,我在寫你的答案之前寫下了我的答案。 – Troyer

+0

謝謝你們解釋。 – Baahubali