从客户端(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、谷歌Chrome直播方案使用详情功能-通道配置Excel导入导出
使用EasyNVR的用户都有知道,由于EasyNVR是将设备与EasyNVR的通道进行绑定的,因此EasyNVR是通过手动的通道配置来进行设备接入的,这样可以做到将设备的和通道对应的接入.但是,如果手 ...
- 百度SMS发送短信C#
/// <summary> /// 百度接口签名帮助类 /// </summary> public class BaiduApiHelper { #region 构造函数 // ...
- java上传文件类型检测
在进行文件上传时,特别是向普通用户开放文件上传功能时,需要对上传文件的格式进行控制,以防止黑客将病毒脚本上传.单纯的将文件名的类型进行截取的方式非常容易遭到破解,上传者只需要将病毒改换文件名便可以完成 ...
- 【Python】解决使用pyinstaller打包Tkinker程序报错问题
问题描述 使用pyinstaller打包使用Tkinter编写的控制台程序,出现报错 15793 INFO: Adding Microsoft.Windows.Common-Controls to d ...
- sed取某域名对应的IP
- 对decimal 类型的数据进行获取调整
Decimal为SQL Server.MySql等数据库的一种数据类型,不属于浮点数类型,可以在定义时划定整数部分以及小数部分的位数. 好处:使用精确小数类型不仅能够保证数据计算更为精确,还可以节省储 ...
- 关于一致性hash,这可能是全网最形象生动最容易理解的文档,想做架构师的你来了解一下
问题提出 一致性hash是什么?假设有4台缓存服务器N0,N1,N2,N3,现在需要存储数据OBJECT1,OBJECT2,OBJECT3,OBJECT4,OBJECT5,OBJECT5,OBJECT ...
- flask db操作
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # app.config[' ...
- 【题解】Luogu CF1172B Nauuo and Circle
原题传送门 题意:在圆上有n个节点(珂以构成凸多边形),让你给节点编号,使得将题目给你的边(一棵树)没有交叉 我们钦定1为这个树的根节点.任意节点\(x\)的一颗子树的点应该是圆弧上连续的一段(我也不 ...
- MySQL8.0 下载安装启动(Windows10)
2019年6月13日20:13:21 MySQL8.0 下载安装启动(Windows10) 下载 下载地址:https://dev.mysql.com/downloads/mysql/8.0.html ...
安全须知