1,修改配置文件:
<httpRuntime requestValidationMode = "2.0" />
以上修改是必须的,因为高版本的.netframework
2,将需要提交危险字符的页面,关闭验证:
<%@ Page Language="C#" AutoEventWireup="true" ValidateRequest = "false"
增加了一个配置:ValidateRequest = "false" 表示关闭当前页面的验证;
3,你需要在后台对能预见的所有提交字段进行编码,使用:HtmlEncode方法
注意:
1,你之所以关闭这个页面的验证,是因为你这个页面需要给用户提供提交“危险”字符的能力。
2,虽然给用户提供了可以提交危险字符的功能,但是不代表不需要处理。其实更合理的方式是,对危险字符提前进行转换,显示时再转换回去。比如用[]替换<>
很多人是在web.config直接关闭验证功能是不合适的,这相当于关闭了asp.net框架提供的安全保护功能;
<pages validateRequest="false"></pages>
这个配置是最好不要用的。
资料:https://www.aspsnippets.com/Articles/A-potentially-dangerous-RequestForm-value-was-detected-from-the-client.aspx
关键字:A potentially dangerous Request.Form value was detected from the client
默认情况下,ASP.Net会验证所有可能导致跨站点脚本和SQL注入的不安全内容的输入控件。因此,它通过抛出上述异常来禁止此类内容。默认情况下,建议允许在每次回发时进行此检查。
参考资料:https://www.c-sharpcorner.com/article/a-potentially-dangerous-request-form-value-was-detected-from-the-client/
参考资料:https://docs.microsoft.com/en-us/previous-versions/aspnet/hh882339(v=vs.110)?redirectedfrom=MSDN
文章标题:在ASP.NET中进行请求验证
这个才是好的参考资料,非常全面。
请求验证是ASP.NET中的一项功能,它检查HTTP请求并确定它是否包含潜在的危险内容。在这种情况下,潜在的危险内容是请求的正文,标头,查询字符串或cookie中的任何HTML标记或JavaScript代码。ASP.NET执行此检查,因为可能出于恶意目的添加了URL查询字符串,cookie或发布的表单值中的标记或代码。
例如,如果您的网站具有用户输入评论的表单,则恶意用户可以在script元素中输入JavaScript代码。当您向其他用户显示评论页面时,浏览器将执行JavaScript代码,就像该代码是您的网站生成的一样。此漏洞通常被称为跨站点脚本(XSS)攻击。
请求验证有助于防止这种攻击。如果ASP.NET在请求中检测到任何标记或代码,它将引发“检测到潜在危险值”错误并停止页面处理。
当检测到任何HTML标记(包括无害的标记,如<b>(粗体)元素)时,请求验证都会引发此异常。如果您希望您的应用程序接受HTML标记,则在这种情况下引发错误可能是一个问题。例如,如果您的站点允许用户添加评论,则您可能希望通过使用HTML标记(使文本以粗体或斜体显示)来使用户添加基本格式。在这种情况下,您可以禁用请求验证并手动检查恶意内容。或者,您可以自定义请求验证,以便接受某些类型的标记或脚本。有关如何自定义请求验证的信息,请参见白皮书《ASP.NET 4中的安全性扩展》(PDF)。有关如何指定自定义错误页面而不是默认错误页面的信息,请参阅如何:处理应用程序级错误。
安全须知 |
---|
即使您正在使用请求验证,您也应该在从页面上获得用户输入的文本之前,先对其进行HTML编码。(除非您手动检查了它的潜在恶意标记,如稍后所述。)有关如何对文本进行HTML编码的信息,请参见博客条目ASP.NET 4中HTML编码输出的新<%:%>语法(和ASP.NET MVC 2),作者:Scott Guthrie。 |
禁用请求验证
安全须知 |
---|
如果禁用请求验证,则必须检查用户自己输入的危险HTML或JavaScript。有关更多信息,请参见本主题后面的“ 手动检查请求”。 |
用于禁用请求验证的方法取决于您使用的ASP.NET Web应用程序类型:
-
ASP.NET Web表单
-
ASP.NET MVC
-
ASP.NET网页
在ASP.NET Web表单(ASP.NET 4或更高版本)中禁用请求验证
您可以禁用整个应用程序的请求验证,但是不建议这样做。建议仅针对要允许标记的虚拟路径或特定页面有选择地禁用请求验证。
无论哪种情况,您都必须在Web.config文件中进行两项更改。第一个更改是将httpRuntime元素的requestValidationMode属性设置为“ 2.0”。此设置使请求验证在请求处理事件的顺序中稍后发生。对于使用ASP.NET 4和更高版本的应用程序,此设置是必需的,因为从ASP.NET 4开始,请求验证在请求生命周期中比在早期版本的ASP.NET中更早进行。
XML格式
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
下面的示例显示如何使请求验证稍后在单个页面(在本例中为Test.aspx页面)中发生:
<location path="test.aspx">
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
</location>
第二个更改是将validationRequest设置为false。对于整个应用程序,您可以使用Web.config文件中的pages元素执行此操作,如以下示例所示。(仅当您还设置了requestValidationMode =“ 2.0”时,此设置才有效。)
<configuration>
<system.web>
<pages validateRequest="false" />
</system.web>
</configuration>
对于单个页面,可以在页面的@ Page指令中将validationRequest设置为false,如以下示例所示:
<@ Page validateRequest="false" %>
在ASP.NET MVC中禁用请求验证
若要在ASP.NET MVC应用程序中禁用请求验证,您必须将请求验证更改为在请求处理顺序中的更早发生,如前面对ASP.NET Web窗体所述。在Web.config文件中,进行以下设置:
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
在ASP.NET MVC中,可以为请求中的操作方法,属性或字段(输入元素)禁用请求验证。如果禁用操作方法的验证,则对调用该方法的所有请求都禁用它,也就是说,所有用户输入均允许调用该操作方法的任何请求。因此,此方法是禁用请求验证的最不安全的方法。
如果禁用对属性的验证,则允许用户输入对该属性的任何引用。如果禁用特定字段的验证,则可以控制哪个请求元素(字段)允许任意用户输入。
要禁用动作方法的请求验证,请使用属性ValidateInput(false)标记该方法,如以下示例所示:
[HttpPost]
[ValidateInput(false)]
public ActionResult Edit(string comment)
{
if (ModelState.IsValid)
{
// Etc.
}
return View(comment);
}
要禁用对特定属性的请求验证,请使用AllowHtml属性标记属性定义:
[AllowHtml]
public string Prop1 { get; set; }
若要对请求中的特定字段(例如,针对输入元素或查询字符串值)禁用请求验证,请在获取商品时调用Request.Unvalidated方法,如以下示例所示:
var rawComment = Request.Unvalidated().Form["comment"];
在ASP.NET网页中禁用请求验证
若要禁用ASP.NET网页的请求验证,请在代码中调用Request.Unvalidated方法,并将要绕过请求验证的字段或其他对象的名称传递给该方法。以下代码段中的注释指示哪些代码行触发请求验证,哪些代码行不触发请求验证。
注意
在不包含Web窗体页面或MVC控制器的ASP.NET Web Pages应用程序中,您不必更改Web.config文件中的任何设置。
var userComment = Request.Form["userInput"]; // Validated, throws error if input includes markup
Request.Unvalidated("userInput"); // Validation bypassed
Request.Unvalidated().Form["userInput"]; // Validation bypassed
Request.QueryString["userPreference"]; // Validated
Request.Unvalidated().QueryString["userPreference"]; // Validation bypassed;
手动检查请求
如果禁用请求验证,则必须手动检查未验证的用户输入是否存在潜在的危险输入。检查危险输入对于应用程序的安全性至关重要。但是,这不一定是一件容易的事。如果您的代码存在缺陷,或者您忘记保护一页或一个字段,那么恶意用户最终可能会发现并利用该缺陷。
通常,您应该尽可能地限制将接受的HTML标签列表,并拒绝其他所有内容。(这种方法有时被称为使用安全条款列表或白名单。)
如果使用的是Web Forms页面,则通常可以使用第三方“富文本”控件,该控件使用户可以设置文本格式。这些控件通常具有内置的验证例程,该例程仅允许安全HTML。(如果使用控件,请确保它提供HTML安全性。)
如果不使用控件,则一种简单的方法是对用户输入进行HTML编码,然后仅对要允许的HTML标签进行有选择地取消编码。如果要允许的标签不包含属性,例如<b>,<strong>,<i>和<em>,则此方法很实用。以下示例显示了一种编码方式,然后仅对<b>和<i>标签进行选择性解码。
// Encode the string input
StringBuilder sb = new StringBuilder(
HttpUtility.HtmlEncode(htmlInputTxt.Text));
// Selectively allow <b> and <i>
sb.Replace("<b>", "<b>");
sb.Replace("</b>", "</b>");
sb.Replace("<i>", "<i>");
sb.Replace("</i>", "</i>");
为了在用户输入中允许更灵活的HTML标记,您可以使用第三方库。示例包括可以从CodePlex网站上下载的HTML Agility Pack和开放源代码OWASP Anti-Samy实用程序。有关更多信息,请参见OWASP网站上的示例,该示例为ASP.NET禁用请求验证。
另一种方法是使用标记的替代形式,例如MarkDown,然后将用户的文本转换为有效且安全的HTML。许多Wiki使用这种方法。有关Markdown的更多信息,请参见Daring Fireball网站。
网址:https://html-agility-pack.net/?z=codeplex
附加信息
-
ASP.NET 4.5和Visual Web Developer 11的新增功能(请参阅“ ASP.NET请求验证新功能”一节)
-
ASP.NET 4中的安全性可扩展性(PDF)。包括有关自定义请求验证(创建“可插拔”验证)的信息。
上面内容复制子微软官网,破坏掉了文章格式,请到原文查看。