zoukankan      html  css  js  c++  java
  • 从客户端中检测到有潜在危险的 Request.Form 值

      asp.net开发中,经常遇到“从客户端检测到有潜在危险的Request.Form 值”错误提示,是输入了<></>之类的字符,没等你的过滤条件检测,一提交就出错,可以在你当前页面添加Page_Error()函数来捕获所有页面处理过程中发生的而没有处理的异常。然后给用户一个合法的报错信息。也可以在Global.asax的Application_Error()来处理,你也可以在那里写通用的异常报错处理函数。如果两个地方都没有写异常处理函数,才会显示这个默认的报错页面呢。

      protected void Page_Error(object sender, EventArgs e)
            {
                Exception ex = Server.GetLastError();
                if (HttpContext.Current.Server.GetLastError() is HttpRequestValidationException)
                {
                    HttpContext.Current.Response.Write("<a href=\"javascript:history.back(0);\">返回</a><br/><br/>请输入合法的字符串!");
                    HttpContext.Current.Server.ClearError();
                }
            }

    通常很多人给出的解决方案是:

    1、web.config文档<system.web>后面加入这一句: <pages validaterequest="false"/>
    示例:
    <?xml version="1.0" encoding="gb2312" ?>
    <configuration>
    <system.web>
    <pages validaterequest="false"/>
    </system.web>
    </configuration>

    2、在*.aspx文档头的page中加入validaterequest="false",示例如下:
    <%@ page validaterequest="false" language="c#" codebehind="index.aspx.cs" autoeventwireup="false" inherits="mybbs.webform1" %>

    其实这样做是不正确的,会给程序安全带来风险,这是把检测攻击的功能关闭了除非是真的想要输入<>之类的字符,那么根据微软的建议,我们应该采取安全上称为“默认禁止,显式允许”的策略。

      首先,我们将输入字符串用 HttpUtility.HtmlEncode()来编码,将其中的HTML标签彻底禁止。

      然后,我们再对我们所感兴趣的、并且是安全标签,通过Replace()进行替换。比如,我们希望有""标签,那么我们就将""显式的替换回""。

    void submitBtn_Click(object sender, EventArgs e)
    {
      //将输入字符串编码,这样所有的HTML标签都失效了。
      StringBuilder sb =new StringBuilder(HttpUtility.HtmlEncode(htmlInputTxt.Text));
      //然后我们选择性的允许<b> 和 <i>
      sb.Replace("&lt;b&gt;", "<b>");
      sb.Replace(
    "&lt;/b&gt;", "</b>");
      sb.Replace(
    "&lt;i&gt;", "<i>");
      sb.Replace(
    "&lt;/i&gt;", "</i>");
      Response.Write(sb.ToString());
    }

    这样我们即允许了部分HTML标签,又禁止了危险的标签。

    根据微软提供的建议,我们要慎重允许下列HTML标签,因为这些HTML标签都是有可能导致跨站脚本攻击的。
    <applet>
    <body>
    <embed>
    <frame>
    <script>
    <frameset>
    <html>
    <iframe>
    <img>
    <style>
    <layer>
    <link>
    <ilayer>
    <meta>
    <object>
    可能这里最让人不能理解的是<img>。但是,看过下列代码后,就应该明白其危险性了。
    <img src="javascript:alert('hello');">

  • 相关阅读:
    SpringMVC视图解析器
    FreeMarker介绍
    一篇很全面的freemarker教程
    request,session,application
    nav布局 在线演示 DIVCSS5
    opacity
    java 某字符串在另一字符串中是否存在
    bochs 使用讲解
    使用VS2015搭建Lua开发环境
    Zip文件格式
  • 原文地址:https://www.cnblogs.com/qfcndtt/p/2802603.html
Copyright © 2011-2022 走看看