【问题标题】:ASP.net XSS request validation not firingASP.net XSS 请求验证未触发
【发布时间】:2011-11-04 11:52:19
【问题描述】:

我有一个 ASP.net 应用程序的小问题 - XSS 请求验证(即引发“潜在危险的 request.form 值...”异常的那个),似乎对我们来说不能正常工作。

我的网站上有以下简单的测试表格:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Test2.aspx.vb" 
      Inherits="Test2" %>

<form id="form1" runat="server">

    <asp:textbox ID="Textbox1" runat="server" ></asp:textbox>

    <asp:Button ID="btnSubmit" runat="server" Text="Uh oh" />

</form>

在我们的 web.config 中为 httpRuntime 元素添加以下内容:

<httpRuntime maxRequestLength="8192" />

如果我在文本框中输入以下文本:

<script>alert('XSS!');</script>

表单发布时没有错误,我希望它会出错,抱怨“潜在危险......等等”。我为按钮添加了一个单击事件处理程序并调用 Request.ValidateInputs() 仍然没有问题。观察 Request 变量,我可以看到一个属性调用 ValidateInputCalled,即使在我显式调用之前也是如此......

我们的目标是框架的 v4.0,我发现如果我像这样编辑 httpRuntime 元素:

<httpRuntime maxRequestLength="8192" requestValidationMode="2.0" />

然后页面请求验证开始像我预期的那样工作(但我认为这不是必需的)。像这样的配置中唯一的另一件事是一组规则,如下所示:

<location path="Admin/News.aspx">
     <system.web>
       <httpRuntime requestValidationMode="2.0"/>
     </system.web>
 </location>

我们使用它来允许我们关闭对一组选定页面的验证(在页面级别关闭),其中允许用户在其文本中提交一组选定的 HTML 标记。

这在以前肯定是有效的。有谁知道为什么这现在可能不起作用?我不想为整个站点恢复到 v2.0 请求验证模式。


刚刚尝试了一个新的网站项目,单页,同上,请求验证错误正在触发。我们的原始站点的 web.config 非常大 - 有人知道此文件中可能影响请求验证的其他属性吗?配置文件中的 pages 节点如下所示:

<pages enableEventValidation="false" enableSessionState="true" 
     enableViewStateMac="true"
     viewStateEncryptionMode="Always" 
     controlRenderingCompatibilityVersion="3.5" 
     clientIDMode="AutoID">

【问题讨论】:

    标签: asp.net xss


    【解决方案1】:

    我也遇到了同样的问题,但在我的情况下,它是 global.asax 的 Application_BeginRequest 中的一个 try-catch,它在访问 HttpContext.Current.Request.Form 时发现了错误,然后就把它吞了。与上传的 cookie 修复有关

    【讨论】:

      【解决方案2】:

      我在追踪类似问题时偶然发现了这个问题。事实证明,有问题的页面将其数据作为 JSON 发布,并且默认的 JSON 模型绑定器不执行 ASP.NET 请求验证。我最终找到了 Imran Baloch 的一篇博客文章,描述了这种已知行为以及解决方法:http://forums.asp.net/t/1682096.aspx?MVC3+JSON+Security

      我知道这不是 OP 的问题,但也许其他人会觉得它有用。

      【讨论】:

        【解决方案3】:

        如果你安装Glimpse我也发现了同样的问题

        web.config 中的以下行完全停止请求验证的发生 - 无论您的 Glimpse 设置是什么:

        <system.webServer>
            <modules runAllManagedModulesForAllRequests="true">
                <add name="Glimpse" type="Glimpse.AspNet.HttpModule, Glimpse.AspNet" preCondition="integratedMode" />
            </modules>
        </system.webServer>
        

        【讨论】:

          【解决方案4】:

          好的。我们将我们的配置文件带到一个只有一个页面的全新站点,然后系统地开始删除部分,直到我们发现问题为止。

          我们对网站中的某些控件使用第三方库,我们发现删除了此部分:

          <httpModules>
              <add name="CallbackManager" 
                type="Dart.PowerWEB.LiveControls.CallbackManager,Dart.PowerWEB.LiveControls"/>
          </httpModules>
          

          为我们解决了问题(但在其他地方给我们带来了一些问题)。

          【讨论】:

          • 这是否意味着有问题的库实际上禁用了页面的请求验证?这是该控件的记录功能吗?
          • 无论如何,请不要仅仅依靠请求验证来阻止 XSS。有 XSS 向量可以绕过它。
          • @Erlend - 此页面上未使用相关控件。不,它更像是一个未记录的“功能”:) 我们已经实施了额外的验证,并试图追查这个问题。
          猜你喜欢
          • 2021-08-09
          • 2011-01-12
          • 1970-01-01
          • 1970-01-01
          • 2023-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多