【问题标题】:request exceeds the configured maxQueryStringLength when using [Authorize]使用 [Authorize] 时请求超出配置的 maxQueryStringLength
【发布时间】:2011-12-30 20:29:05
【问题描述】:


我有一个 C# 中的 MVC3 站点,我有一个特定的视图,它从 JavaScript 函数提供查询参数,该函数通过

重定向到该站点

window.location.href = "../ActionName?" + 查询字符串;

query_string 是 JavaScript 函数构建的动态查询参数字符串。

这种奇怪的原因是有时同一个函数将 URL 传递给 ASP.Net 网络表单,因为它必须使用 reportviewer 控件,替代操作是在其中保存一些参数如果它传递给视图。 (如果没有意义可以详细说明)

在我将 [Authorize] 引入操作方法之前,整个事情都很好。 如果它在适当的位置就中断,没有它就可以正常工作,并且 [Authorize] 在所有其他方法上都可以正常工作。

在这种情况下,整个 URL 是 966 个字符长,经过研究,似乎 ma​​xQueryStringLength 值默认为 2048,但可以覆盖任何整数类型的值,所以我只是为了笑我添加了

<security>
  <requestFiltering>
    <requestLimits maxQueryString="2048"></requestLimits>
  </requestFiltering>
</security>

key下的web配置文件的key。

那里没有欢乐,所以我变得可笑并使其成为4096,仍然没有欢乐。

现在整个 URL 有 966 个字符长,authorize 属性不能严重添加另一个 1082-3130 个字符,所以我如何才能确定错误到底是什么,或者为什么设置没有生效。

VS2010 Pro SP1

【问题讨论】:

  • 请添加您收到的详细错误信息。

标签: c# javascript asp.net-mvc-3


【解决方案1】:

在您项目的根web.config 中,在system.web 节点下:

<system.web>
    <httpRuntime maxUrlLength="10999" maxQueryStringLength="2097151" />
...

此外,我必须在 system.webServer 节点下添加它,否则我的长查询字符串出现安全错误:

<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxUrl="10999" maxQueryString="2097151" />
      </requestFiltering>
    </security>
...

【讨论】:

  • 打开它会产生任何严重的安全漏洞吗?将 maxurl 和 maxquery 设置为 2097151 有什么负面影响?
  • Brian,这是一个很好的问题 - 我看不到任何安全漏洞,除非以某种方式在查询字符串上添加更长的内容(除了浏览器限制之外)可能是有害的。浏览器最大长度查询字符串是否优先于该值是我没有答案的另一个问题。不过感谢您的提问,也许这里有人可以对此有所了解。
  • 我猜可能存在 DOS 漏洞,但这取决于您实际处理请求的方式。我在尝试在一个请求中添加 100 个用户时遇到了这个问题。反正我也不想发生。
  • 这立即解决了我的问题,因为我在 MVC 4 项目中遇到了同样的问题。添加上述两个解决了我的错误。非常感谢!!
  • 请注意maxQueryString 是以 bytes 为单位的长度,最大值为 4294967295,maxQueryStringLength 是以 characters 为单位的长度int 但范围为 0-2097151。
【解决方案2】:

当一个未经授权的请求进来时,整个请求会被 URL 编码,并作为查询字符串添加到授权表单的请求中,因此我可以根据您的情况查看这可能导致问题的地方。

根据 MSDN,修改以在 web.config 中重置 maxQueryStringLength 的正确元素是 &lt;system.web&gt; 元素内的 &lt;httpRuntime&gt; 元素,请参阅 httpRuntime Element (ASP.NET Settings Schema)。尝试修改该元素。

【讨论】:

  • 唉,把它放在正确的地方似乎是诀窍,足够有趣的智能感知引导我到我最初发布它的位置的同一个键。
  • 另外很高兴知道这个参数的最大值是 2097151——起初我尝试使用 Int32.MaxValue,但在运行时抛出的异常指出我使用 0 之间的值和 2097151。
  • 不工作看到这个。 stackoverflow.com/questions/31624710/…
  • 我相信虽然你可以将此参数的最大值设置为 2097151,但还有其他参数会影响接受的最大查询长度。我有一个比这个最大值短得多的查询字符串,它没有被接受——它有 3,393 个字符长。另一个长 3,200 个字符的查询运行良好。
  • @markthewizard1234:同意:我已将我的从 2048 增加到 4096。这 已经 产生了一些影响,因为原始错误消息为 404.something 对于超长查询字符串没有不再出现。但是现在又返回了一条代码为 400 的错误信息,表示查询字符串过长。
【解决方案3】:

对于可能遇到此问题并且上述任何一个选项都无法解决的其他任何人,这对我有用。

1. Click on the website in IIS
2. Double Click on Authentication under IIS
3. Enable Anonymous Authentication

我已禁用此功能,因为我们使用的是我们自己的身份验证,但这会导致同样的问题,并且接受的答案没有任何帮助。

【讨论】:

    【解决方案4】:

    我在使用 datatables.net 时遇到了这个错误

    我修复了在 DataTable() 的 te 属性中将默认 ajax Get 更改为 POST

    "ajax": {
            "url": "../ControllerName/MethodJson",
            "type": "POST"
        },
    

    【讨论】:

    • 我也在使用数据表,在尝试上述建议失败后,这个技巧做到了。
    猜你喜欢
    • 2013-07-09
    • 2013-04-18
    • 2011-09-13
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多