我一直在閱讀上的SQL注入攻擊,並在那裏的文章,他們一直在說這句話是容易注入攻擊:SQL注入串聯VS參數
"SELECT * from tblBlah where userId" +userId
但此查詢是不是」
"SELECT * from tblBlah where userId = @userId";
我試圖找出爲什麼是這樣一個交代。他們倆都期待的一個參數。會不會是第一個查詢可以接受來自URL和第二canno參數T'
我一直在閱讀上的SQL注入攻擊,並在那裏的文章,他們一直在說這句話是容易注入攻擊:SQL注入串聯VS參數
"SELECT * from tblBlah where userId" +userId
但此查詢是不是」
"SELECT * from tblBlah where userId = @userId";
我試圖找出爲什麼是這樣一個交代。他們倆都期待的一個參數。會不會是第一個查詢可以接受來自URL和第二canno參數T'
在第一個查詢的人的情況下,可以通過以下值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
。實際上,用戶可以無限制地控制執行哪個語句。
這是一個簡單的例子,演示了預處理語句的強大功能。使用預處理語句,在查詢實際運行之前,查詢的一般模板或結構已經編譯完成。語句的部分具有參數佔位符,但不會通過串聯來更改查詢,而只能通過分配定位的值。
謝謝你的詳細解釋。 – Baahubali
在第一次查詢時,數據庫不知道它是否有更多條件或查詢的目的是什麼,那麼數據庫將盲目地信任查詢。
第二個數據庫在啓動時會得到查詢,並確切知道你想要做什麼以及查詢應該有多少個參數,如果來自參數的東西改變了初始行爲或者根本不存在,該查詢將不被信任,並會引發錯誤。
我現在將用示例來解釋。
如果你這樣做:
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參數和你編程的語言,它會或多或少是安全的,但其中最安全的將是使用存儲過程參數化查詢。
第二個可能意味着某種形式的_prepared語句_。 – CBroe
我強烈推薦這個[閱讀](http://www.sommarskog.se/dynamic_sql.html#SQL_injection) –