抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

ASP.NET 请求验证功能可以为我们自动辨别来自客户端提交的数据,避免站点受到 XSS 的攻击。但是在一些特殊情况下,比如我们使用富文本编辑器让用户输入一篇新闻,新闻内容包括文字,图片等,还有排版格式等,当客户端将文本内容提交给服务器时,服务器如果辨识出文本中包含有一些不被允许的特殊字符或者标签,将阻止内容的提交。但是这部分内容是用户的“合法输入内容”,这时候的请求验证势必是多余的。所以为了应对这种问题,我们可以采用以下处理方式。

基于 .Net Framework 2.0 WebForm 的网站

在 aspx 页面顶部添加一段代码:ValidateRequest="false"

1
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Demo.aspx.cs" Inherits="MainPage.Demo" ValidateRequest="false" %>

基于 .Net Framework 4 WebForm 的网站

  1. 和基于 .Net Framework 2.0 WebForm 的网站一样,在 aspx 网页顶部添加代码:ValidateRequest="false"

  2. 修改 web.config 配置文件,添加这段代码:<httpRuntime requestValidationMode="2.0" />

    1
    2
    3
    <system.web>
    <httpRuntime requestValidationMode = "2.0" />
    </system.web>

基于 ASP.NET MVC 的网站

  1. 如果需要全局取消验证(不安全),修改根目录 web.config 文件,如果只是局部取消验证,修改需要取消验证的目录就近的 web.config 文件

    1
    2
    3
    <system.web>
    <pages validateRequest="false" ></pages>
    </system.web>
  2. 页面对应的 Action 方法添加 [ValidateInput(false)] 属性

    1
    2
    3
    4
    5
    6
    [HttpPost]
    [ValidateInput(false)]
    public ActionResult Edit( FormCollection form)
    {
    //CODE
    }
  3. MVC 页面使用 Html.Raw() 方法输出带 HTML 页面。

使用 HtmlEncode, HtmlDecode编码和解码

发送端使用 Server.HtmlEncode(string) 方法,对字符串进行编码,接收端使用 Server.HtmlDecode 解码。

1
2
3
4
5
6
7
protected void Page_Load(object sender, EventArgs e)
{
//编码
string htmlEncoded = Server.HtmlEncode(originalStr);
//解码
string originalStr = Server.HtmlDecode(htmlEncoded);
}

评论