[英]What is a good way to prevent websites from xss attacks
我正在使用 C# web forms 和 asp.net。 該網站需要安全,現在正在通過安全審核。 我只是想知道需要做些什么來最好地防止對我的網站的 XSS 攻擊。
我知道該站點的 output 有可用的編碼。 我還研究了來自微軟的 antixsslibrary.dll 但這對我來說似乎已經過時了。 asp.net 是否有任何內置的防止 xss 攻擊? 我被引導認為它確實如此,因為我試圖在我自己的網站上創建和 xss 攻擊並且我收到錯誤:
“/GNB.DPS.MVAD.Presentation.Web”應用程序中的服務器錯誤。
從客戶端檢測到一個潛在危險的 Request.Form 值 (ctl00$cphListBody$tbXSS="alert('XSS V...")。說明:請求驗證檢測到一個潛在危險的客戶端輸入值,並且對請求的處理已經已中止。此值可能表示試圖破壞應用程序的安全性,例如跨站點腳本攻擊。要允許頁面覆蓋應用程序請求驗證設置,請將 httpRuntime 配置部分中的 requestValidationMode 屬性設置為 requestValidationMode="2.0 "。示例:。設置此值后,您可以通過在 Page 指令或配置部分中設置 validateRequest="false" 來禁用請求驗證。但是,強烈建議您的應用程序在這種情況下顯式檢查所有輸入。有關詳細信息,請參閱http://go.microsoft.com/fwlink/?LinkId=153133 。
異常詳細信息:System.Web.HttpRequestValidationException:從客戶端檢測到潛在危險的 Request.Form 值 (ctl00$cphListBody$tbXSS="alert('XSS V...")。
ASP.NET 提供的工具可以讓您防御 XSS 攻擊,但不能自動防御。 您需要知道攻擊是什么,以及如何使用這些工具來防御它們。
您顯示的錯誤是默認設置,它試圖阻止錯誤的用戶輸入,因為它正在進入 web 應用程序。 這是一個很好的步驟,但不要讓 if 給你一種錯誤的安全感。 錯誤輸入還有其他方法可以進入您的數據,從而使您的網站易受攻擊。
例如,假設您的網站是由用戶數據驅動的。 您編寫的數據輸入屏幕可能會阻止“潛在危險內容”,但沒有什么可以阻止某人使用其他界面輸入數據 - 他們自己的界面,SQL Server Management Studio 等。如果他們在那里得到錯誤的腳本,您的網站將愉快地將那些危險的腳本呈現給用戶。
防止 XSS 的唯一方法是在數據被發送到瀏覽器時對其進行清理,而不是在數據進入時對其進行清理。
最基本的方法是使用內置的 Server.HtmlEncode() function 來清除所有來自不受信任來源的字符串。 (不受信任的意思是除您自己硬編碼的字符串之外的任何內容。數據庫、文件和 web 服務不是受信任的來源。)
Server.HtmnlEncode 可以做的事情是有限制的。 我個人喜歡使用Microsoft Anti-Xss 庫,因為它做得更好(白名單與黑名單過濾)並提供更多功能(如 GetSafehtmlFragment())。
web 上有大量資源用於此目的。 我將從這里開始:
https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet
然后專門針對 .NET:
http://msdn.microsoft.com/en-us/library/aa973813.aspx
編輯 - 添加
這里的主要問題似乎是對輸入過濾和 output 過濾之間的區別的誤解。 這篇文章很好地解釋了差異並且比我在這里使用得更好:
http://jeremiahgrossman.blogspot.com/2007/01/input-validation-or-output-filtering.html
最后編輯,然后我會停下來。
甚至微軟也承認我上面所說的。 請參閱這篇文章: http://msdn.microsoft.com/en-us/library/ms998274.aspx
來自文章:
不要依賴輸入清理
一種常見的做法是讓代碼嘗試通過過濾掉已知的不安全字符來清理輸入。 不要依賴這種方法,因為惡意用戶通常可以找到繞過驗證的替代方法。 相反,您的代碼應該檢查已知的安全輸入。 表 1 顯示了表示一些常見字符的各種安全方法。
輸入驗證是您防御庫中的一種工具,但僅此還不夠。
您可以查看 CodePlex 上的Microsoft Web 保護庫。 您還可以查看OWASP 上的 XSS 頁面以及備忘單。
除了之前的答案:您收到的消息是由 ASP.NET 的 RequestValidation 功能生成的。 它嘗試過濾惡意內容,例如在 QueryString 中。
雖然這是一個好的開始,但它還不夠安全,您不必再擔心腳本攻擊。
另請注意,在 ASP.NET 4.0 中默認禁用 RequestValidation: http://geekswithblogs.net/bbastiaensen/archive/2010/12/13/request-validation-in-asp.net-4.0.x
就個人而言,我不喜歡 RequestValidation 功能。 基本上,它是在猜測用戶輸入的一串文本是否有害。 你不能指望它捕捉到每一個可能的攻擊字符串。 當用戶在您的表單中輸入合法值時,這也可能導致錯誤。
這就是問題所在。 假設您的 web 站點顯示訪問者輸入的文本行。
作為惡意用戶,我輸入<script>window.location='http://www.grossout.com'></script>
。
如果此文本是 output 直接發送到瀏覽器,則下次有人訪問您的 web 站點時,他們將被重定向到 www.grossout.com。
另一方面,友好的訪問者可能會輸入This is a cool web site <:-)
。
下次有人訪問您的 web 站點時,由於<
字符,他們將收到格式錯誤的 html。
在此示例中,最好的解決方案可能是使用Server.HtmlEncode()
方法,該方法將轉義<
字符,以便在不破壞頁面的情況下正確顯示。
如果您使用的是 JavaScript,您可以使用 jQuery .text
方法來轉義<
字符。
我相信這兩種解決方案都優於使用 RequestValidation,因為它們允許顯示任何文本而不會導致用戶看到錯誤消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.