[Authorize]を使用すると、リクエストが構成済みのmaxQueryStringLengthを超える


121

ここに画像の説明を入力してください
私はC#にMVC3サイトを持っています。JavaScript関数からクエリパラメータが供給されている特定のビューがあります。関数は、

window.location.href = "../ActionName?" + query_string;

query_stringは、JavaScript関数によって作成された動的クエリパラメータ文字列です。

この奇妙さの理由は、reportviewerコントロールを使用する必要があるため、同じ関数がURLをASP.Net Webフォームに渡す場合があるためです。代わりのアクションは、この場合、ビューに渡される一部のパラメーターを保存することです。(それが意味をなさない場合は、さらに詳しく説明できます)

アクションメソッドに[Authorize]を導入するまでは、すべてがうまくいきます。所定の位置にある場合は中断し、それがなくても正常に機能し、[Authorize]は他のすべての方法で正常に機能します。

この場合のURL全体は966文字です。調査後、maxQueryStringLengthの値はデフォルトで2048 であるように見えますが、整数型の任意の値にオーバーライドできるので、笑いのために

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

キーの下のWeb構成ファイルのキー。

そこには喜びがないので、私はとんでもないことになり、それを4096にしたが、それでも喜びはない。

URL全体が966文字であるため、authorize属性で真に1082〜3130文字を追加することはできません。そのため、実際にエラーが何であるか、または設定が有効にならない理由を判断するにはどうすればよいですか。

VS2010 Pro SP1


受け取った詳細なエラーメッセージを追加してください。
counsellorben 2011年

回答:


70

不正なリクエストが届くと、リクエスト全体がURLエンコードされ、クエリ文字列としてリクエストの承認フォームに追加されるため、状況によって問題が発生する可能性がある場所を確認できます。

MSDNによると、web.configのmaxQueryStringLengthをリセットするために変更する正しい要素は、<httpRuntime>要素内の<system.web>要素です。httpRuntime要素(ASP.NET設定スキーマ)を参照してください。その要素を変更してみてください。


1
悲しいかな、それを正しい場所に置くことはトリックのようです、十分なインテリセンスが私を最初にそれを投稿した場所にある同じキーに案内してくれるので、興味深いです。
Sabre

8
また、知っている良い本のparamの最大値は2097151です-最初のIでInt32.MaxValueをを使用しようとしましたが、実行時にスローされた例外は0と2097151の間の値を使用するように私を指摘
TimDog

動作しませんこれを参照してください。stackoverflow.com/questions/31624710/...
Jitendra Pancholi

1
このパラメーターの最大値を2097151に設定できますが、受け入れられる最大クエリ長に影響する他のパラメーターがあると思います。許容されないこの最大よりもはるかに短いクエリ文字列がありました-それは3,393文字長でした。3,200文字の別のクエリは問題なく機能しました。
markthewizard1234 2015年

@ markthewizard1234:同意:私は2048から4096に鉱山を増やしました。これ、長すぎるクエリ文字列に対する404.somethingの元のエラーメッセージが表示されなくなったため、ある程度の効果がありました。しかし、今度は、コード400の別のエラーメッセージが返され、クエリ文字列が長すぎること示しています。
またはMapper

212

web.configプロジェクトのルートのsystem.webノードの下:

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

さらに、system.webServerノードの下にこれを追加する必要がありました。そうしないと、長いクエリ文字列に対してセキュリティエラーが発生しました。

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

1
これを開くと、深刻なセキュリティ上の欠陥が生じますか?maxurlとmaxqueryを2097151に設定することの欠点は何ですか?
Brian

1
ブライアン、それはいい質問です。ブラウザの制限以外にクエリ文字列に何か長いものを入れて害を及ぼさない限り、セキュリティ上の欠陥はありません。ブラウザの最大長のクエリ文字列がこの値よりも優先されるかどうかは、答えがわからないもう1つの質問です。でも質問してくれてありがとう、多分ここにいる誰かがこれについてもっと光を当てることができるでしょう。
theJerm 2012

DOSの潜在的な脆弱性があると思いますが、それは実際にリクエストを処理する方法に依存します。1回のリクエストで100人のユーザーを追加しようとしたときに、これに遭遇しました。とにかく起こりたいことではない。
Martin、

4
私はMVC 4プロジェクトで同じ問題を抱えていたため、これは私の問題をすぐに解決しました。上記の両方を追加すると、エラーが解決しました。どうもありがとうございます!!
Ed DeGagne

3
maxQueryStringに長さバイト 4294967295の最大値UINTようmaxQueryStringLengthに長さの文字 intとしてしかし0-2097151の範囲で。
マーズ

5

この問題が発生する可能性があり、上記のいずれのオプションでも解決しない場合は、これが私にとってうまくいきました。

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

独自のAuthを使用していたため、これを無効にしましたが、同じ問題が発生し、受け入れられた回答はまったく役に立ちませんでした。


4

datatables.netを使用してこのエラーが発生しました

DataTable()のプロパティで、デフォルトのajax Get to POSTの変更を修正しました

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

私もデータテーブルを使用していて、上記の提案に失敗した後、このトリックはそれを行いました。
AidaM 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.