使用 [Authorize] 时请求超过配置的 maxQueryStringLength

IT技术 c# javascript asp.net-mvc-3
2021-03-14 10:25:42

在此处输入图片说明
我在 C# 中有一个 MVC3 站点,我有一个特定的视图正在从 JavaScript 函数提供查询参数,该函数通过以下方式重定向到该站点

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

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

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

在我将 [Authorize] 引入 action 方法之前,整个过程都很好。如果它就位,则中断,没有时也能正常工作,并且 [授权] 在所有其他方法上都可以正常工作。

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

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

密钥下的 web 配置文件的密钥。

那里没有快乐,所以我变得荒谬并使它成为 4096,仍然没有快乐。

现在整个 URL 为 966 个字符,授权属性不能认真添加另一个 1082-3130 个字符,所以我如何确定错误究竟是什么,或者为什么设置没有生效。

VS2010 专业版 SP1

4个回答

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

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

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

<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxUrl="10999" maxQueryString="2097151" />
      </requestFiltering>
    </security>
...
布赖恩,这是一个很好的问题 - 我看不到任何安全漏洞,除非以某种方式在查询字符串上加上浏览器限制之外的更长的内容可能是有害的。浏览器最大长度查询字符串是否优先于这个值是另一个我没有答案的问题。感谢您的提问,也许这里的某个人可以对此有所了解。
2021-04-22 10:25:42
打开它会产生任何严重的安全漏洞吗?将 maxurl 和 maxquery 设置为 2097151 有什么负面影响?
2021-04-23 10:25:42
我想存在潜在的 DOS 漏洞,但这取决于您实际处理请求的方式。我在尝试在一个请求中添加 100 个用户时遇到了这个问题。反正不是我想发生的事情。
2021-05-04 10:25:42
请注意,maxQueryString字节单位的长度为 uint,最大值为 4294967295,maxQueryStringLength字符为单位的长度为 int,但范围为 0-2097151。
2021-05-08 10:25:42
这立即解决了我的问题,因为我在 MVC 4 项目中遇到了同样的问题。添加以上两个解决了我的错误。太感谢了!!
2021-05-09 10:25:42

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

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

唉,把它放在正确的地方似乎是诀窍,足够多的智能感知引导我到我最初发布它的位置的同一个键。
2021-04-16 10:25:42
我相信虽然您可以将此参数的最大值设置为 2097151,但还有其他参数会影响可接受的最大查询长度。我有一个比这个最大值短得多的查询字符串,但它不被接受——它有 3,393 个字符长。另一个长达 3,200 个字符的查询运行良好。
2021-04-27 10:25:42
2021-05-10 10:25:42
同样很高兴知道这个参数的最大值是 2097151——起初我尝试使用 Int32.MaxValue,但在运行时抛出的异常指示我使用 0 到 2097151 之间的值。
2021-05-12 10:25:42
@markthewizard1234:同意:我已将我的从 2048 增加到 4096。这产生了一些影响,因为 404.something 超长查询字符串的原始错误消息不再出现。但是现在,又返回了另一个代码为 400 的错误消息,表明查询字符串过长。
2021-05-12 10:25:42

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

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

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

我在使用 datatables.net 时遇到此错误

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

"ajax": {
        "url": "../ControllerName/MethodJson",
        "type": "POST"
    },
我也在使用数据表,在尝试上述建议失败后,这个技巧做到了。
2021-05-07 10:25:42