關於從客戶端中檢測到有潛在危險的值的最優解決方案
以下是引用片段:
Server Error in '/YourApplicationPath' Application
A potentially dangerous Request.Form. value was detected from the client
(txtName="").
Description: Request Validation has detected a potentially dangerous client input value, and processing of the request has been aborted. This value may indicate an attempt to compromise the security of your application, such as a cross-site scripting attack. You can disable request validation by setting validateRequest=false in the Page directive or in the configuration section. However, it is strongly recommended that your application explicitly check all inputs in this case.
Exception Details: System.Web.HttpRequestValidationException: A potentially dangerous Request.Form. value was detected from the client (txtName="").
....
這是ASP.Net提供的一個很重要的安全特性。因為很多程式設計師對安全沒有概念,甚至都不知道XSS這種攻擊的存在,知道主動去防護的就更少了。ASP.Net在這一點上做到預設安全。這樣讓對安全不是很瞭解的程式設計師依舊可以寫出有一定安全防護能力的網站。
但是,當我Google搜尋 HttpRequestValidationException 或者 "A potentially dangerous Request.Form. value was detected from the client"的時候,驚奇的發現大部分人給出的解決方案竟然是在ASP.Net頁面描述中通過設定 validateRequest=false 來禁用這個特性,而不去關心那個程式設計師的網站是否真的不需要這個特性。看得我這叫一個膽戰心驚。安全意識應該時時刻刻在每一個程式設計師的心裡,不管你對安全的概念瞭解多少,一個主動的意識在腦子裡,你的站點就會安全很多。
為什麼很多程式設計師想要禁止 validateRequest 呢?有一部分是真的需要使用者輸入"<>"之類的字元。這就不必說了。還有一部分其實並不是使用者允許輸入那些容易引起XSS的字元,而是討厭這種報錯的形式,畢竟一大段英文加上一個ASP.Net典型異常錯誤資訊,顯得這個站點出錯了,而不是使用者輸入了非法的字元,可是自己又不知道怎麼不讓它報錯,自己來處理報錯。
對於希望很好的處理這個錯誤資訊,而不使用預設ASP.Net異常報錯資訊的程式設計師們,你們不要禁用validateRequest=false。
正確的做法是在你當前頁面新增Page_Error()函式,來捕獲所有頁面處理過程中發生的而沒有處理的異常。然後給使用者一個合法的報錯資訊。如果當前頁面沒有Page_Error(),這個異常將會送到Global.asax的Application_Error()來處理,你也可以在那裡寫通用的異常報錯處理函式。如果兩個地方都沒有寫異常處理函式,才會顯示這個預設的報錯頁面呢。
舉例而言,處理這個異常其實只需要很簡短的一小段程式碼就夠了。在頁面的Code-behind頁面中加入這麼一段程式碼:
以下是引用片段:
protected void Page_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
if (ex is HttpRequestValidationException)
{
Response.Write("請您輸入合法字串。");
Server.ClearError(); // 如果不ClearError()這個異常會繼續傳到Application_Error()。
}
}
這樣這個程式就可以截獲 HttpRequestValidationException 異常,而且可以按照程式設計師的意願返回一個合理的報錯資訊。
這段程式碼很簡單,所以我希望所有不是真的要允許使用者輸入之類字元的朋友,千萬不要隨意的禁止這個安全特性,如果只是需要異常處理,那麼請用類似於上面的程式碼來處理即可。
而對於那些通過明確禁止了這個特性的程式設計師,自己一定要明白自己在做什麼,而且一定要自己手動的檢查必須過濾的字串,否則你的站點很容易引發跨站指令碼攻擊。
關於存在Rich Text Editor的頁面應該如何處理?
如果頁面有富文字編輯器的控制元件的,那麼必然會導致有類的HTML標籤提交回來。在這種情況下,我們不得不將validateRequest="false"。那麼安全性怎麼處理?如何在這種情況下最大限度的預防跨站指令碼攻擊呢?
根據微軟的建議,我們應該採取安全上稱為“預設禁止,顯式允許”的策略。
首先,我們將輸入字串用 HttpUtility.HtmlEncode()來編碼,將其中的HTML標籤徹底禁止。
然後,我們再對我們所感興趣的、並且是安全標籤,通過Replace()進行替換。比如,我們希望有""標籤,那麼我們就將""顯式的替換回""。
示例程式碼如下:
以下是引用片段:
void submitBtn_Click(object sender, EventArgs e)
...{
// 將輸入字串編碼,這樣所有的HTML標籤都失效了。
StringBuilder sb = new StringBuilder(
HttpUtility.HtmlEncode(htmlInputTxt.Text));
// 然後我們選擇性的允許 和
sb.Replace("<b>", "");
sb.Replace("</b>", "");
sb.Replace("<i>", "");
sb.Replace("</i>", "");
Response.Write(sb.ToString());
}
這樣我們即允許了部分HTML標籤,又禁止了危險的標籤。
根據微軟提供的建議,我們要慎重允許下列HTML標籤,因為這些HTML標籤都是有可能導致跨站指令碼攻擊的。
以下是引用片段:
#
相關文章
- "從客戶端中檢測到有潛在危險的 Request.Form 值"的解決方案彙總客戶端ORM
- MVC專案從客戶端中檢測到有潛在危險的 Request.Form 值 的解決方法MVC客戶端ORM
- 檢測到有潛在危險的Request.Form值解決辦法ORM
- Android so庫防客戶端破解的解決方案Android客戶端
- 客戶端影片渲染目前最理想的解決方案客戶端
- win10沒有telnet客戶端怎麼辦 windows10中沒有telnet客戶端的解決教程Win10客戶端Windows
- 關於客戶端 APP 的專項測試怎麼做客戶端APP
- MQTT協議從服務端到客戶端詳解MQQT協議服務端客戶端
- 電子商務中潛在的危機
- Golang 中 defer Close() 的潛在風險Golang
- Feign客戶端呼叫服務時丟失Header引數的解決方案客戶端Header
- Ascend2:為潛在客戶轉化建立關係
- ASP程式設計中Session物件失效的客戶端解決方法程式設計Session物件客戶端
- (十九)冒險和預測,解決危險就能抓住機會
- 關於客戶端資訊流思考客戶端
- Linux的10個最危險的命令Linux
- 檔案上傳——客戶端檢測繞過(JavaScript檢測)(一)客戶端JavaScript
- Linux的10個最危險命令Linux
- React拾遺:從10種現在流行的 CSS 解決方案談談我的最愛 (中)ReactCSS
- Lens —— 最炫酷的 Kubernetes 桌面客戶端客戶端
- Python中eval帶來的潛在風險Python
- 優秀的Git客戶端:Tower for macGit客戶端Mac
- 學習一個PHP中用於檢測危險函式的擴充套件TaintPHP函式套件AI
- 請問一下大家,客戶端做 UI 自動化測試有沒有好的方案客戶端UI
- win/mac 端有哪些客戶端自動化測試的想法呢Mac客戶端
- "Hotpatch"潛在的安全風險
- 客戶端專案管理的挑戰及解決方法客戶端專案管理
- 關於如何編寫好金融科技客戶端SDK的思考客戶端
- 從工具升級為解決方案,有讚的新站位指向新價值
- 商業潛規則揭秘:從成交藝術到客戶滿意度的全方位策略
- 通過命令列在 Python 中測試以太坊 RPC 客戶端命令列PythonRPC客戶端
- 通過命令列在Python中測試以太坊RPC客戶端命令列PythonRPC客戶端
- 透過命令列在 Python 中測試以太坊 RPC 客戶端命令列PythonRPC客戶端
- 關於AppDelegate瘦身的多種解決方案APP
- 瀏覽器支援ES6的最優解決方案瀏覽器
- Bash漏洞檢測及解決方案
- CRM客戶關係管理系統的價值
- 探索專有領域的端到端ASR解決之道
- PyLint 的優點、缺點和危險