】“从客户端(ctl00$Content$txtContent)中检测到有潜在危险的 Request.Form 值”之解

本文介绍了ASP.NET中HttpRequestValidationException异常的产生原因及其多种处理方法。推荐使用自定义异常处理来替代直接禁用请求验证。
“/WebSite”应用程序中的服务器错误。从客户端(ctl00$Content$txtContent="木木木木木木木<br />
")中检测到有潜在危险的 Request.Form 值。说明: 请求验证过程检测到有潜在危险的客户端输入值,对请求的处理已经中止。该值可能指示存在危及应用程序安全的尝试,如跨站点脚本攻击。若要允许页面重写应用程序请求验证设置,请将 httpRuntime 配置节中的 requestValidationMode 特性设置为 requestValidationMode="2.0"。示例: <httpRuntime requestValidationMode="2.0" />。设置此值后,可通过在 Page 指令或 <pages> 配置节中设置 validateRequest="false" 禁用请求验证。但是,在这种情况下,强烈建议应用程序显式检查所有输入。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkId=153133。

异常详细信息: System.Web.HttpRequestValidationException: 从客户端(ctl00$Content$txtContent="木木木木木木木<br />
")中检测到有潜在危险的 Request.Form 值。


解决方法(不推荐)

A potentially dangerous Request.Form value was detected from the client (txtTest="<b>"). 由于在.net中,Request时出现有HTML或Javascript等字符串时,系统会认为是危险性值。立马报错。

解决方案一:
在.aspx文件头中加入这句:
<%@ Page validateRequest="false" %>

解决方案二:
修改web.config文件:
<configuration>
<system.web>

<httpRuntime requestValidationMode="2.0" />

<compilation debug="true">
<pages validateRequest="false" />
</system.web>
</configuration>

因为validateRequest默认值为true。只要设为false即可。

来源:[清清月儿]
禁止validateRequest的办法
http://blog.youkuaiyun.com/21aspnet/archive/2007/03/20/1535531.aspx

解决方法(推荐)

为什么很多程序员想要禁止 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("<script language=javascript>alert('字符串含有非法字符!')</script>");
Server.ClearError(); // 如果不ClearError()这个异常会继续传到Application_Error()
Response.Write("<script language=javascript>window.location.href='default.aspx';</script>");
}
}

这样这个程序就可以截获 HttpRequestValidationException 异常,而且可以按照程序员的意愿返回一个合理的报错信息。

这段代码很简单,所以我希望所有不是真的要允许用户输入<xxx>之类字符的朋友,千万不要随意的禁止这个安全特性,如果只是需要异常处理,那么请用类似于上面的代码来处理即可。

而对于那些通过明确禁止了这个特性的程序员,自己一定要明白自己在做什么,而且一定要自己手动的检查必须过滤的字符串,否则你的站点很容易引发跨站脚本攻击。
<think>我们正在讨论SELinux配置文件中的属性上下文,具体是`ctl.start$`中的`$`符号的含义。根据SELinux的策略语言,属性(property)在SELinux中用于表示系统属性,通常以`property_svc`为类型进行标识。在策略规则中,我们可能会看到对属性的访问控制。在SELinux中,属性名称后面的`$`符号是一个通配符,它表示匹配以指定字符串开头的所有属性。例如,`ctl.start$`表示匹配所有以"ctl.start"开头的属性。这种用法类似于正则表达式中的前缀匹配。在SELinux的策略语言中,这种通配符通常用于简化策略编写,避免为每个类似的属性单独编写规则。例如,在Android系统中,init进程会设置和获取许多系统属性,其中有些属性是以"ctl.start"开头的,用于启动服务。在SELinux策略中,我们可以使用通配符来允许某个域(domain)访问所有以"ctl.start"开头的属性。下面是一个策略规则的示例:```allowdomain_nameproperty_svc:property_serviceset{ctl.start$};```这条规则允许`domain_name`域设置(set)所有以"ctl.start"开头的属性(类型为`property_svc`)。因此,`$`符号在这里的作用是表示通配符匹配,即匹配以"ctl.start"为前缀的所有属性。注意:在SELinux中,属性名称是严格匹配的,但使用`$`作为通配符时,只能匹配前缀,且只能出现在属性名称的末尾。参考文献:[^1]:SELinux策略语言规范中关于属性匹配的说明。[^2]:AndroidSELinux策略指南中关于属性上下文的描述。§§相关问题§§1.SELinux策略中还有哪些通配符的使用?2.如何查看当前Android设备上的SELinux属性上下文?3.在SELinux策略中,如何为特定属性(而不是前缀)编写规则?</think>### SELinux配置文件中属性上下文 `ctl.start$` 的 `$` 符号含义 在 SELinux 策略语言中,属性上下文如 `ctl.start$` 中的 `$` 符号是一个**通配符**,表示**匹配以指定前缀开头的所有属性名称**。具体来说: 1. **前缀匹配功能** `ctl.start$` 中的 `$` 表示匹配所有以 `ctl.start` 开头的属性名称。例如: - `ctl.start.foo_service` - `ctl.start.bar_daemon` - 任何形如 `ctl.start.<后缀>` 的属性名都会匹配此规则。 2. **语法规则依据** 该语法遵循 SELinux 策略语言的 `property_service` 类定义: ```sepolicy class property_service { set; # 设置属性 get; # 获取属性 } ``` 在策略规则中使用时: ```sepolicy allow <domain> property_svc:property_service { set } { ctl.start$ }; ``` 表示允许指定域(domain)设置所有以 `ctl.start` 开头的属性[^1]。 3. **实际应用场景** 在 Android 系统中,`ctl.start$` 通常用于控制 **init 进程对服务的启停操作**: - `ctl.start` 用于启动服务(如 `ctl.start.foo_service`) - `ctl.stop` 用于停止服务 通过通配符 `$` 可一次性授权所有同类操作,避免为每个服务单独编写策略[^2]。 4. **与精确匹配的区别** 若需精确匹配单个属性(如仅允许 `ctl.start.foo_service`),需移除 `$` 并指定完整属性名: ```sepolicy allow init property_svc:property_service set { ctl.start.foo_service }; ``` > **技术背景**:SELinux 的属性系统(`property_svc`)用于管理系统运行时参数(如 `ro.debuggable`),而 `ctl.*` 属性是 Android 特有的服务控制接口,由 `init` 进程实现。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值