2012-02-14 40 views
0

其中一個最普遍的攻擊是當今跨站點腳本(XSS),它更多的是對你的應用程序的用戶不是在應用程序本身的攻擊,但它利用服務器端的應用程序漏洞都是一樣的。其結果可能是災難性的,並可能導致信息泄露,身份欺騙,和特權爲什麼我應該在.NET爲我「做」時手動輸入消毒?

閱讀this文件我看到消毒服務器端/驗證輸入之前管理它們的許多建議提升。

嗯,我所知道的,使用存儲過程(對於DB側)和.NET(以管理電子得到的答覆)我很肯定。

你能告訴我這樣一個場景,存儲過程和.NET可能會失敗(不消毒/驗證),並在那裏我可以是「不安全」?

正如我所說的,我的意思是「安全」,而不是數據的持久性/準確性!在那裏,我同意消毒輸入...

回答

1

我知道我的回答引用的Java,但我覺得它至少提供一些背景(另一個原因響應大對此事發表評論)爲什麼我們需要的服務器/客戶端輸入的衛生也。

從你所引用的文件:

String Fields 

To validate string fields, such as names, addresses, tax identification numbers, and so on, use regular expressions to do the following: 

    Constrain the acceptable range of input characters. 
    Apply formatting rules. For example, pattern-based fields, such as tax identification numbers, ZIP codes, or postal codes, require specific patterns of input characters. 
    Check lengths. 

如果你還沒有任何在客戶端/服務器端,熟練的攻擊者可能會破壞你的系統通過提供較長的輸入限制此字符串/類型/驗證長度字符串。事實上,這是Java中的一個問題(不確定它適用於.NET/IIS,假設它是因爲.NET使用散列碼實現平等,我可能也是錯誤的)。

這裏有趣的是,我們有前兩天在這裏SO

如果您可以將字符串大小限制爲限制字符。您可以安全地避免這些問題。

0

如果您將數據傳遞給標準的.NET Framework對象,那麼這些應該處理自己的衛生問題。您應該將需要清理的數據視爲.NET不知道如何處理的所有數據。即.NET框架不知道它將用於什麼的數據。

例如,.NET框架不會知道一個字符串值,將被用作社會安全號碼。如果您將此傳遞給第三方系統(無論是直接傳遞還是存儲在數據庫中),然後再傳遞給第三方系統,則需要清理並驗證輸入,以檢查社會安全號碼是否符合預期格式。如果不這樣做,可能會使您的系統因第三方系統中的安全漏洞而受到攻擊。例如一個包含某些字符的社會安全號碼可能會導致第三方系統崩潰,並且這可能會在您的系統嘗試與停機的服務進行通信時創建拒絕服務。這種情況只是衆多可能性中的一種,它不一定會導致DOS攻擊,但最終你會想要驗證和消毒輸入以防止未知。

如您特別提到XSS,這是標準.NET Web控件實際易受攻擊的漏洞,除非請求驗證的默認選項處於活動狀態(請參閱http://www.asp.net/whitepapers/request-validation)。這是因爲.NET Web控件在設置Text屬性時不會自動對HTML字符進行編碼。因此,如果您在沒有進行請求驗證的情況下運行網站,則應確保所有輸出都已正確編碼(這是一種輸出限制)。鑑於我選擇使用MVC框架而不是Web表單進行開發,因爲它可以很容易地使用HTML輸出清理(例如,使用<%:%>括號將HTML自動編碼輸出)。這使您的應用程序能夠正確處理在輸入中輸入的惡意(和非惡意)標記,而不需要驗證,因爲輸出已經過適當的消毒處理,所以如果您的應用程序受此方式的保護,則可以禁用請求驗證,這是我的首選選項,那麼你不會不必要地操縱用戶輸入。例如,如果SO清理了輸入並刪除了<script>標記,則我不可能將它們包含在此郵件中。

Web應用常見的另一種衛生方式是正確格式化將注入JavaScript的字符串(例如單引號和雙引號字符)。簡而言之,您將防止用戶通過輸入插入惡意JavaScript,這些輸入將顯示給其他用戶並在未正確清理時執行,並且在執行時,請求將作爲可能具有更高安全級別的新用戶在應用程序和各種損害可能發生。

+0

好的答案!那麼...... – markzzz 2012-02-15 13:45:09

+0

1 - 「如果你將數據傳遞給標準的.NET Framework對象,那麼這些應該處理他們自己的衛生問題」我應該調用哪種類型的句柄?或者你的意思是「它自動調用它自己的衛生工具?」 – markzzz 2012-02-15 13:45:42

+0

2 - 是的,我的意思是「肯定」在考慮「請求驗證」活動。事實上,將它變成虛假:它是一個很好的功能,我沒有看到爲什麼要禁用它:) – markzzz 2012-02-15 13:46:24

0

通風輸入很少是正確的選擇。您應該清理或編碼它的使用位置,因爲只有您知道需要編碼,轉義或刪除的內容。

在大多數情況下,當您使用精心設計的API時,手動消毒不是必需的。但在某些情況下,您仍然需要手動進行編碼或驗證,因爲您知道的不僅僅是API。例如,自動html編碼輸出不保護你,如果字符串用在嵌入html頁面的一段javascript內部。

<script>var text="@Model.UserControlledData";</script> 

自動編碼規則適合HTML,而不是javascript字符串,所以這將是不安全的。