• ASP.NET防御XSS跨站攻击


    目前做ASP.NET项目的时候就有遇到过“用户代码未处理HttpRequestValidationException:从客户端***中检测到有潜在危险的 Request.Form/Request.QueryString值。”的问题,其实这是ASP.NET对于XSS攻击的一种防御手段,防止恶意的HTML标记或脚本数据注入到网站中。

    遇到这种问题,我百度了一下,看了大神写的博客,于是转载+备份。

    要解决这个问题需要对应多种情况,并且有多种方法来解决。在ASP.NET WebForm项目中可以对单独页面或者全局页面进行处理。

    方法一:在出现问题的页面中,设置头部Page的属性ValidateRequest=false,代码如下:

    <%@ Page Language="C#" ValidateRequest="false" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication13.WebForm1" %>
    

    MSDN关于ValidateRequest属性的描述:如果 ASP.NET 针对危险值检查来自浏览器的输入,则为 true;否则为 false。 默认值为 true。

    方法二:在配置文件中 设置system.web 节点下pages节点的validateRequest="false",代码如下:

      <system.web>
        <pages validateRequest="false"></pages>
        <httpRuntime requestValidationMode="2.0"/>
      </stytem.web>

    注意:

    1、方法二要慎用,方法二是全局配置,一旦关闭了全站的请求验证,网站就很有可能受到各种攻击以及接受许多危险的数据,比如最常见的XSS攻击。

    2、方法一和方法二设置生效都有一个前提,就是配置文件中的httpRuntime 节点的验证模式必须为2.0,.Net Framework4.0版本以上的项目,不设置的话默认验证模式是4.0,4.0的验证模式ValidateRequest=false将会无效,除非 你的ASP.NET项目使用的还是.NET 4.0以下的框架。

    代码如下:

      <system.web>
        <httpRuntime requestValidationMode="2.0"/>
      </stytem.web>

    总结MSDN的资料,概括来说就是4.0的验证模式默认是全站HTTP请求都会进行验证,包括COOKIE请求、.ashx一般处理程序请求都会进行验证。而2.0的模式只是针对当前的.aspx页面,这里看下微软MSDN上的说明:

    RequestValidationMode 属性指定要使用的 ASP.NET 验证方法。 这可以是在 ASP.NET 版本(早于版本 4)中或在 .NET Framework 4 中使用的版本中使用的算法。 可以将属性设置为下列值:
    
    4.0(默认)。 HttpRequest 对象在内部设置一个标志,该标志指示每当访问 HTTP 请求数据时应触发请求验证。 这可保证在请求期间访问数据(如 cookie 和 URL)之前触发请求验证。 配置文件中页元素(如果有的话)的请求验证设置或单独页面中的 @ 页指令的请求验证设置将被忽略。
    2.0. 仅对网页(而不是对所有 HTTP 请求)启用请求验证。 此外,配置文件中的 pages 元素(如果有的话)的请求验证设置或单独页中的 @ Page 指令的请求验证设置用来确定要验证哪些页请求。
    
    未验证分配给此属性的值是否匹配特定版本的 ASP.NET。 任何小于 4.0(例如 3.72.92.0)的数值将被解释为 2.0。 任何大于 4.0 的数值将被解释为 4.0。
    
    若要在配置文件中设置此值,可以为 httpRuntime 元素的 requestValidationMode 特性赋值。 有关更多信息,请参见 httpRuntime 元素(ASP.NET 设置架构)。

    3、方法一也是在特定环境下才可以取消验证,对于用户的输入内容,必须要做好相对应的防御措施,基本的可以使用 HttpUtility.HtmlEncode()对用户输入文本进行编码。当然推荐还是使用AntiXSS类库,在.NET Framework4.5以上的版本已经将这个类库包含进去,有兴趣的朋友可以研究下System.Web.Security.AntiXss 命名空间。

    另外一个就是ASP.NET MVC项目,MVC中比较简单,只要在控制器上设置属性ValidateInput(false)就行,例如:

    [HttpPost]
    [ValidateInput(false)]
    public ActionResult Create(string strText)
    {
    /*此处省略代码1000行……..*/
    }

    另外即使是ASP.NET MVC,也要在配置文件中设置验证模式为2.0,否则设置也是无效的。

    本文转载于:http://shiyousan.com/post/635563669112062894

  • 相关阅读:
    Shiro权限验证
    5种设计模式整理
    多模块的SpringBoot项目
    Go使用数据库
    使用Go mod
    docker基本使用
    Go的IO操作
    实现一个网盘存储……
    Go的网络编程
    学习golang的历程
  • 原文地址:https://www.cnblogs.com/yy981420974/p/5543305.html
Copyright © 2020-2023  润新知