"從客戶端中檢測到有潛在危險的 Request.Form 值"的解決方案彙總

#事故現場

  在一個asp.net 的項目中,前端經過ajax將富文本中的文字內容post到服務端的一個ashx中,在ashx中嘗試讀取參數值時,html

結果報錯:「從客戶端中檢測到有潛在危險的 Request.Form 值」前端

#事故分析

  因爲在asp.net中,Request提交時出現有html代碼字符串時,程序系統會認爲其具備潛在危險的值。會報出「從客戶端 中檢測到有潛在危險的Request.Form值」這樣的Error。web

  而富文本中的內容是包含html代碼的,因此...ajax

#解決方案:

一、前端對富文本字符串進行encodeURI編碼,服務端進行HttpUtility.UrlDecode解碼操做;

  前端代碼:json

 1     var str = '<p><span style="color: #00B0F0;"><em><strong>我想留在你的身邊,</strong></em></span><br/></p><p><span style="color: #7030A0;"><strong><span style="text-decoration: underline;">深情款款多麼可憐;</span></strong></span></p>';
 2     $(function() {
 3         $.ajax({
 4             type: "post",
 5             url: "TestHandle.ashx",
 6             data: { Title: 'jack', Content: encodeURI(str) },
 7             success: function (data) {
 8                 $("#div").html(data);
 9             }
10         });
11     });

  後端代碼:後端

1     public void ProcessRequest(HttpContext context)
2     {
3         string str = context.Request["content"];
4         string content = HttpUtility.UrlDecode(str);
5         context.Response.ContentType = "text/plain";
6         context.Response.Write(content);
7     }

  效果圖:app

二、前端不以form的方式提交,直接以json方式提交,服務端從request的body中讀取數據,而後反序列化,獲得信息;

  前端代碼:asp.net

 1     var str = '<p><span style="color: #00B0F0;"><em><strong>我想留在你的身邊,</strong></em></span><br/></p><p><span style="color: #7030A0;"><strong><span style="text-decoration: underline;">深情款款多麼可憐;</span></strong></span></p>';
 2     var temp = { Title: 'jack', Content: str };
 3     $.ajax({
 4         type: "post",
 5         url: "TestHandle.ashx",
 6         contentType:"application/json;charset=utf-8",
 7         data: JSON.stringify(temp),
 8         success: function (data) {
 9             $("#div").html(data);
10         }
11     });

  後端代碼:xss

1     string bodyText;
2     using (var bodyReader = new System.IO.StreamReader(context.Request.InputStream))
3     {
4         bodyText = bodyReader.ReadToEnd();
5     }
6     dynamic bodyObj = JsonConvert.DeserializeObject(bodyText);
7 
8     context.Response.ContentType = "text/plain";
9     context.Response.Write(bodyObj.Content);

  效果圖:post

#其餘場景的解決方案:

一、aspx頁面,當前頁面進行form提交

  打開當前.aspx頁面,頁頭加上代碼:validateRequest=」false」,如:

<%@ Page Language="C#" ValidateRequest="false" AutoEventWireup="false" CodeFile="default.aspx.cs" Inherits="default" %>

  該方法不推薦,還有一種修改web.config配置文件的方法,強烈不推薦,就不寫在這裏了;

二、在ASP.NET MVC中的解決方案

  1)、針對某個實體類的單個字段設置 [AllowHtml] ,這樣提交的時候,系統就會放過該字段。

  2)、前端代碼:

 1     var str = '<p><span style="color: #00B0F0;"><em><strong>我想留在你的身邊,</strong></em></span><br/></p><p><span style="color: #7030A0;"><strong><span style="text-decoration: underline;">深情款款多麼可憐;</span></strong></span></p>';
 2     $(function () {
 3         $.ajax({
 4             type: "post",
 5             url: "Home/Test",
 6             data: { Title: 'jack', Content: str },
 7             success: function (data) {
 8                 $("#div").html(data.ok);
 9             }
10         });
11     });

  3)、後端代碼:

1     public class NewInfo
2     {
3         public string Title { get; set; }
4         [AllowHtml]
5         public string Content { get; set; }
6     }
1     public ActionResult Test(NewInfo info)
2     {
3         return Json(new { ok = info.Content});
4     }

 #寫在最後

 該文只是淺顯的總結一下,其中涉及的xss方面,沒有詳細考慮,歡迎指正!

——————————————————————————————————————————

相關文章
相關標籤/搜索