从客户端(content="xxxxx")中检测到有潜在危险的 Request.Form 值——较合理解决方案
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)。包括有关自定义请求验证(创建“可插拔”验证)的信息。
上面内容复制子微软官网,破坏掉了文章格式,请到原文查看。
从客户端(content="xxxxx")中检测到有潜在危险的 Request.Form 值——较合理解决方案的更多相关文章
- “从客户端(content="XXXX")中检测到有潜在危险的 Request.Form值” 解决方案
解决方案一: 在.aspx文件头中加: <%@Page validateRequest="false" %> 解决方案二: 修改web.config文件: <co ...
- 从客户端(FCKeditor1="<p>...")中检测到有潜在危险的 Request.Form 值。
从客户端(FCKeditor1="<p>...")中检测到有潜在危险的 Request.Form 值. 说明: 请求验证过程检测到有潜在危险的客户端输入值,对请求的处理 ...
- 从客户端中检测到有潜在危险的Request.Form值的详细解决方案
ASP.Net1.1后引入了对提交表单自动检查是否存在XSS(跨站脚本攻击)的能力.当用户试图用之类的输入影响页面返回结果的时候,ASP.Net的引擎会引发一个HttpRequestValidatio ...
- 从客户端(txtNewsContent="<hr />")中检测到有潜在危险的 Request.Form 值。怎么办呀?
<system.web><httpRuntime requestValidationMode="2.0" executionTimeout="3600& ...
- ASP.NET MVC从客户端中检测到有潜在危险的 Request.Form 值
ASP.NET MVC4(Razor)从客户端中检测到有潜在危险的 Request.Form 值 “/”应用程序中的服务器错误. 从客户端(Content=" sdfdddd ...&quo ...
- ASP.NET MVC4(Razor)从客户端中检测到有潜在危险的 Request.Form 值
SP.NET MVC4(Razor)从客户端中检测到有潜在危险的 Request.Form 值 “/”应用程序中的服务器错误. 从客户端(Content=" sdfdddd ..." ...
- 从客户端中检测到有潜在危险的Request.Form 值
今天往MVC中加入了一个富文本编辑框,在提交信息的时候报了如下的错误:从客户端(Content="<EM ><STRONG ><U >这是测试这...&q ...
- MVC中提示错误:从客户端中检测到有潜在危险的 Request.Form 值的详细解决方法
今天往MVC中加入了一个富文本编辑框,在提交信息的时候报了如下的错误:从客户端(Content="<EM ><STRONG ><U >这是测试这...&q ...
- mvc 从客户端 中检测到有潜在危险的 Request.Form 值
天往MVC中加入了一个富文本编辑框,在提交信息的时候报了如下的错误:从客户端(Content="<EM ><STRONG ><U >这是测试这...&qu ...
随机推荐
- EasyNVR摄像机网页无插件直播方案H5前端构建之:如何区分PC端和移动端
背景分析 随着互联网基础设施建设的不断完善和发展,带宽的不断提速,尤其是光纤入户,4G/5G/NB-IoT各种网络技术的大规模商用,视频随时随地可看.可控的诉求越来越多,尤其是移动应用技术和前端技术的 ...
- Linux系统下的SSH 使用总结
对于linux运维工作者而言,使用ssh远程远程服务器是再熟悉不过的了!对于ssh的一些严格设置也关系到服务器的安全维护,今天在此,就本人工作中使用ssh的经验而言,做一些总结记录来下. -bash: ...
- OpenLayers加载百度离线瓦片地图(完美无偏移)
本文使用OpenLayers最新版本V5.3.0演示:如何使用OpenLayer完美无偏移加载百度离线瓦片地图.OpenLayers 5.3.0下载地址为:https://github.com/ope ...
- python学习-29 map函数-filter函数
movie_person = ['小红','小明','小王','富豪_sb','美女_sb'] def filter_test(array): ret = [] for i in array: if ...
- libevent源码分析二--timeout事件响应
libevent不仅支持io事件,同时还支持timeout事件与signal事件,这篇文件将分析libevent是如何组织timeout事件以及如何响应timeout事件. 1. min_heap ...
- 实现一个 web 服务器
在 system1 上配置一个站点 http://system1.group8.example.com/,然后执行下述步骤: 1.从 http://server.group8.example.com/ ...
- Unity - LayerMask简析
本文简述了LayerMask的定义,后通过项目实战充分解析 LayerMask中的GetMask.LayerToName.NameToLayer 等函数的使用方法及其注意事项. 项目地址:3D坦克大战 ...
- 给自己看的Cache,三段代码
此篇是我记录代码的一个草稿,不是一篇正式的博文,误点的别介意啊. 公司的框架中Cache实现文件: (1)CacheUtil.cs using System.Collections.Generic; ...
- .Net Core WebApi(3)—NLog
在.Net Core中,微软提供的内置的日志组件没有实现将日志记录到文件.数据库上.这里使用NLog替代内置的日志组件 1.在项目中引入NuGet包 NLog NLog.Web.A ...
- angular复习笔记4-模板
Angular复习笔记4-模板 简介 模板是一种自定义的标准化页面,通过模板和模板中的数据结合,可以生成各种各样的网页.在Angular中,模板的默认语言是HTML,几乎所有的HTML语法在模板中都是 ...
安全须知