zoukankan      html  css  js  c++  java
  • 从客户端检测到有潜在危险的Requert.From值解决方案备忘

    对提交表单自动检查是否存在XSS(跨站脚本攻击)的能力。当用户试图用输入影响页面返回结果的时候,ASP.Net的引擎会引发一个HttpRequestValidationExceptioin异常。

    默认情况下会返回如下文字的页面:以下是引用片段:

    ServerErrorin'/YourApplicationPath'Application ApotentiallydangerousRequest.Formvaluewasdetectedfromtheclient (txtName="<b>"). Description:RequestValidationhasdetectedapotentiallydangerousclientinputvalue,andprocessingoftherequesthasbeenaborted.Thisvaluemayindicateanattempttocompromisethesecurityofyourapplication,suchasacrosssitescriptingattack.YoucandisablerequestvalidationbysettingvalidateRequest=falseinthePagedirectiveorintheconfigurationsection.However,itisstronglyrecommendedthatyourapplicationexplicitlycheckallinputsinthiscase. ExceptionDetails:System.Web.HttpRequestValidationException:ApotentiallydangerousRequest.Formvaluewasdetectedfromtheclient(txtName="<b>"). ....

    不考虑安全直接取消报警的方法:

    解决方案一:   在.aspx文件头中加入这句:

    <%@PagevalidateRequest="false"  %>

    MVC中在控制器ActionResult方法前加入[validateRequest=false]

    解决方案二:修改web.config配置

    <configuration>
    <system.web>
    <pagesvalidateRequest="false"/>
    </system.web>
    </configuration>

    以前都在用上述两种方式处理,忽略了安全性的考虑,今天查了资料,有了新的解决方案.

    防止XXS攻击,安全的解决办法

    在当前页面添加Page_Error()函数,来捕获所有页面处理过程中发生的而没有处理的异常。然后给用户一个合法的报错信息。如果当前页面没有Page_Error(),这个异常将会送到Global.asax的Application_Error()来处理,你也可以在那里写通用的异常报错处理函数。如果两个地方都没有写异常处理函数,才会显示这个默认的报错页面。

    在当前页面加入如下方法:

    protected void Page_Error(objectsender,EventArgse)
    {
    Exceptionex=Server.GetLastError();
    if(exisHttpRequestValidationException)
    {
    Response.Write("输入合法字符串。");
    Server.ClearError();//如果不ClearError()这个异常会继续传到Application_Error()。
    }
    }

    这样可以截获HttpRequestValidationException异常,然后即可按照程序员的意愿给出相应的合理的错误提示,

    如果只是需要异常处理,那么只需要写类似于上面的方法即可,最好不要随意禁止这个安全特性.

    存在RichTextEditor富文本编译器的页面处理:

    根据微软的建议,我们应该采取安全上称为“默认禁止,显式允许”的策略。

    将输入的内容用HttpUtility.HtmlEncode()编码,彻底禁止HTML标签,然后在对感兴趣并且安全的标签用Replace()进行替换。

    voidsubmitBtn_Click(objectsender,EventArgse)
    {
    //将输入字符串编码,这样所有的HTML标签都失效了。
    StringBuildersb=newStringBuilder(
    HttpUtility.HtmlEncode(htmlInputTxt.Text));
    //然后我们选择性的允许<b>和<i>
    sb.Replace("&lt;b&gt;","<b>");
    sb.Replace("&lt;/b&gt;","");
    sb.Replace("&lt;i&gt;","<i>");
    sb.Replace("&lt;/i&gt;","");
    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');">
      <img src="java&#010;script:alert('hello');">
    <img src="java&#X0A;script:alert('hello');">
    
    //style标签
    <style type="text/javascript">...
    alert('hello');
    </style>

    看了这两个代码片段,确实要考虑网站安全性的问题,适时的对异常信息进行处理给出合理的提示信息,不能盲目的禁止这个安全特性.

  • 相关阅读:
    支持向量机SVM知识梳理和在sklearn库中的应用
    Android P HIDL demo代码编写 (原创)
    Android P HIDL服务绑定模式与直通模式的分析 (原创)
    NFCApplication 启动分析(原创)
    Android native进程间通讯的实例 (原创)
    android 6.0 高通平台sensor 工作机制及流程(原创)
    NFC OMA 访问
    NXP NFC移植及学习笔记(原创)
    自定义View实战
    从0开始学自定义View -1
  • 原文地址:https://www.cnblogs.com/aaronguo/p/2836648.html
Copyright © 2011-2022 走看看