2010-10-12 61 views
3

我目前正在編寫一個應用程序,它在前端使用ajax,在後端使用ASP.NET(C#)..使用Javascript或C#防止SQL注入的最佳方法?

小部分應用程序對後端代碼執行AJAX調用來自SQL數據庫的條目)

如何防止JScript注入的SQL?

我知道用javascript驗證通常是不安全的,因爲javascript可以關閉,但因爲這是一個AJAX調用,所以如果用戶關閉了javascript,AJAX將永遠不會運行。

什麼是驗證或轉義輸入的最佳方式?

像PHP中的Add_Slashes()?

感謝

丹尼爾

+0

我想說的是,使用SQL * *參數在SQL命令(也可以讓你避免連接包含來自用戶的數據的SQL語句部分)應該刪除大部分問題。 – 2010-10-12 10:53:38

回答

11

使用參數化查詢,從不建立SQL代碼字符串。

+1

請在答案中提供更多細節,解釋會很好。 – icedwater 2015-07-27 08:20:41

+1

@icedwater,代碼中參數的參數化方式取決於服務器上使用的語言,數據庫服務器和框架。問題中的信息太少,無法在此處給出一個很好的示例(它僅將C#指定爲語言,但不包含有關數據庫或數據訪問框架的信息)。 – Lucero 2015-07-27 12:27:48

+0

我同意,但我想即使是一個簡單的例子來說明如何參數化查詢在這裏會有所幫助。沒關係。這是一個小問題。 – icedwater 2015-07-27 14:29:50

14

防護SQL注入需要,即呼入電話來自於發生在服務器端,而不管。

基於Javascript的衛生方法總是沒用,因爲Javascript運行在客戶端,因此可以僞造。

這也適用於AJAX調用:客戶端不需要關閉JavaScript;他們只需要操縱他們從你的網站上下載的Javascript代碼來僞造驗證。

永遠不會依靠客戶端數據衛生。

+1

是的,操縱,甚至更容易,完全繞過。你也可以在你的網站上放置文字,只是要求你的用戶很好,而不是試圖破解你的網站。 – 2010-10-12 10:55:07

+0

謝謝!真正有用的信息.. – 2010-10-12 11:16:34

2

我認爲使用參數化查詢而不是專用SQL

+0

請在您的答案中提供更多詳細信息,解釋會很好。 – icedwater 2015-07-27 08:20:57

1

無論你做什麼,你都必須在服務器上運行驗證碼。

ajax調用不可避免地會碰到服務器,因此驗證用戶輸入以避免SQL注入攻擊。

在客戶端驗證用戶輸入的唯一原因是爲了避免對服務器的調用,例如用戶沒有填寫必填字段。

在服務器上,如果使用LINQ to SQL或實體更新數據庫,則可以免費獲得參數化查詢以避免SQL注入攻擊。

從不,永遠不會寫出純SQL字符串並將其傳遞給數據庫,除非您明確使用參數化查詢。

但只是使用LINQ,你會保持自己(和你的客戶!)安全。

0

Javascript驗證缺乏安全性與JavaScript可能關閉無關。

JavaScript可能被關閉意味着一個誠實的錯誤可能會做錯事,或導致默認的服務器消息,而不是一個有用的。雖然他們可能意外觸發了一個安全問題(我實際上是以用戶的身份完成這項工作的,但最糟糕的是我的輸入是有效的,但我輸入的其中一個人的名字中有一個',更多內容見下文)。這影響了誠實但不完美的用戶,而不是餅乾。

一個黑客應該能夠在大約30秒內以不同的值重播一個AJAX請求,其中包括在另一個窗口中在社交媒體網站上做出愚蠢威脅的時間。這在技術上並不困難。這就是爲什麼Javascript驗證沒有安全價值的原因,並且僅僅是爲了驗證對於誠實的錯誤更加用戶友好(通過具有更直接的響應並且能夠將焦點指向不正確的字段)。

此外,這通常不是驗證問題,而是編碼問題。有些人試圖通過禁止可能導致它們的序列來「修復」SQL注入攻擊,這通常意味着禁止撇號字符。然後他們把這個邏輯放到合理包含撇號的字段上。特別是,絕對不要使用名稱字段來做這件事;人們真的不喜歡被告知他們的名字是「錯誤的」,並且更糟糕的是,他們可能會感覺到種族主義或文化不敏感,因爲你會發現他們很多。法國或愛爾蘭的名字,但不常用英文或德文的名字(是的,我知道諾曼起源的英文名字通常有它們,但我也聽到有名字的撇號人在他們的名字中咆哮愚蠢的種族主義網站,不會讓他們輸入他們的名字是正確的,這可能是提出諾曼人作爲糾正的最壞時期)。

驗證在JavaScript中顯然錯誤作爲改進UI的手段。

驗證服務器上顯然是錯誤的,作爲改進UI的手段和捕獲攻擊的方法。

以正確的方式將您的數據傳遞給其他圖層。在SQL方面,這意味着編碼字符串分隔符(再次,'是最常見的情況,但對於某些數據庫可能還有其他一些分隔符),對此,最好的方法是通過一個庫來完成。在C#的情況下,這意味着使用ADO.NET使用Parameters,而不是自己構建SQL(這也有其他優點)。

0

這裏經常混淆兩個概念。驗證和編碼/轉義。添加斜線是爲上下文編碼數據的嘗試。驗證是關於根據域確定數據是否有效。

要回答你的問題,避免這些問題的最佳方法是雙重的。首先驗證服務器端的數據(確保一個數字的確是一個數字等)。然而,驗證不足以避免這些問題。名稱「O'Brian」是一個有效名稱的例子,所以它會通過驗證,但它可能會導致JavaScript或SQL語句中的問題。

所以下一部分是上下文感知編碼。將數據粘貼到SQL語句中時,需要對SQL進行轉義/編碼。做到這一點的最簡單和最安全的方法是使用參數化查詢,其中一切都爲您處理。 更多信息:http://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

當數據被髮送回客戶端,你需要逃出/編碼數據在要返回的數據格式,以避免腳本注入,你需要知道,如果你是逃避裏面。一個json字符串,一個HTML屬性等等。看到這裏瞭解如何逃脫的不同的上下文信息:http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet 使用AntiXSS轉義/編碼網頁:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=f4cd231b-7e06-445b-bec7-343e5884e651