潜在的に危険なRequest.Path値がクライアントから検出されました(*)


218

自明のエラーが表示されます。

潜在的に危険なRequest.Path値がクライアントから検出されました(*)。

この問題は*リクエストURL が原因です。

https://stackoverflow.com/Search/test*/0/1/10/1

このURLは、「test *」が検索用語で、残りのURLが他のさまざまなフィルターに関連する検索ページにデータを入力するために使用されます。

URLでこれらの特殊文字を許可する簡単な方法はありますか?を変更しようとしましたがweb.config、役に立ちませんでした。

特殊文字を手動でエンコード/デコードする必要がありますか?または、これを行うためのベストプラクティスがあります。クエリ文字列の使用は避けたいです。-しかし、それはオプションかもしれません。

アプリケーション自体は、c# asp.netルーティングを使用して上記の素晴らしいURLを生成するwebformsアプリケーションです。


1
ページValidateRequest=falseの上部にありますか?
Neil Knight、

私は同じ理由で ' localhost /:// localhost / myWebsiteName 'のようなURLを作成するリダイレクトをWebサイトが内部で試みていた理由がわかりません。ASP.netパイプラインがそれを危険な要求URLと見なしている理由がわかりません。
RBT 2016

回答:


97

この*文字はURLのパスでは使用できませんが、クエリ文字列で使用しても問題はありません。

http://localhost:3286/Search/?q=test*

これはエンコードの問題で*はなく、文字はURLで特別な意味を持たないため、URLエンコードするかどうかは関係ありません。別のスキームを使用してエンコードしてからデコードする必要があります。

たとえば、エスケープ文字として任意の文字を使用します。

query = query.Replace("x", "xxx").Replace("y", "xxy").Replace("*", "xyy");

そしてデコード:

query = query.Replace("xyy", "*").Replace("xxy", "y").Replace("xxx", "x");

15
「xxx」「xxy」「xyy」ゲームはかなり賢いです。読者を混乱させないように、その背後にあるロジックについて詳しく説明することをお勧めします。
SimpleVar 2014

2
リクエストはPATH、クエリ文字列ではなくで使用することでした。
Hugo Delsing 2015年

パラメータの1つがURLである同じシナリオに遭遇しました。適切にURLエンコードされている場合でも、このエラーが発生します。最後に、何が起こっているのかを理解しようとするよりもはるかに簡単な、パラメーターをbase64でエンコード(そして私のAPIでデコード)しました。おそらく、独自の置換ルーチンを実装するよりも良い選択です。
SpokaneDJ 2016

1
aa<=> aab<=> *をより単純なコード化スキームとして使用できませんか?
Jaredのような言葉

今のところこれは、おかげで私を救った、しかし、適切な時間に私はこの助言をチェックする:stackoverflow.com/a/603962/1830909とあなたの考えを聞く場合、私は空き地になるでしょう。
QMasterは

316

.NET 4.0を使用している場合は、web.configを介してこれらのURLを許可できるはずです。

<system.web>
    <httpRuntime 
            requestPathInvalidCharacters="&lt;,&gt;,%,&amp;,:,\,?" />
</system.web>

アスタリスク(*)を削除したことに注意してください。元のデフォルトの文字列は次のとおりです。

<httpRuntime 
          requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,:,\,?" />

詳細については、この質問を参照してください。


5
アクションでmvc属性を使用してこれを行う方法があるため、アプリ全体でこれをオフにする必要はありませんか?ここでのこの回答と同様:stackoverflow.com/a/1540976/298758
longda

4
@longda:おそらく、必要なURLの<location path = "my / path">要素でラップしてみてください。リフレクションの使用はグローバルな観点からはかなり簡単ですが、コントローラー/アクションごとに設定するかどうかはわかりません。たぶん質問を始めますか?
Dave Transom 2013年

ASP.net MVCプロジェクトでは機能せず、viewStartでレイアウトを決定する実行プロセスを受信すると、次のエラーが発生します。パスに不正な文字があります。
QMaster 2018

7

私にとっては、web api 2.0で.net 4.5.2に取り組んでいますが、同じエラーが発生します。requestPathInvalidCharacters= ""をrequestPathInvalidCharactersに追加するだけで設定できます。許可されていない文字を設定する必要があります。それ以外の文字を削除する必要があります。この問題を引き起こします。

<system.web>
     <httpRuntime targetFramework="4.5.2" requestPathInvalidCharacters="" />
     <pages  >
      <namespaces>
     ....
 </namespaces>
    </pages> 
  </system.web>

**これは良い習慣ではないことに注意してください。オブジェクトの属性の方が優れているか、特殊文字をエンコードしようとしているため、このパラメーターを持つ投稿である可能性があります。-REST APIを設計するためのベストプラクティスを検索した後、検索、並べ替え、およびページネーションで、クエリパラメーターを次のように処理する必要があることがわかりました

/companies?search=Digital%26Mckinsey

これにより、URLをエンコードしてURLに何らかの方法で%26再配置するときの問題が解決され、サーバーで正しいパラメーターDigital&Mckinseyを受け取ります

このリンクは、レストWeb APIの設計のベストプラクティスに役立つ場合があります https://hackernoon.com/restful-api-designing-guidelines-the-best-practices-60e1d954e7c9


6

ルート値をエンコードしてから、(必要な場合)検索する前に値をデコードする必要があります。


御返答いただき有難うございます。*などのアイテムを置き換えて、それを読んでいるときに元に戻すという意味ですか?

値のエンコードとデコードのコード例を見せていただけますか?
Ciaran Gallagher

1

私にとって、URLを入力するときに、ユーザーが誤って/ではなく/を使用しました。クエリパラメータを開始するには

例えば:

url.com/endpoint/parameter=SomeValue&otherparameter=Another+value

あるはずです:

url.com/endpoint?parameter=SomeValue&otherparameter=Another+value


はい、私にとっても同じですurl.com/endpoint¶meter=SomeValue&otherparameter=AnotherValue
Bhargav Konda

0

この例外は私のアプリケーションで発生し、誤解を招くものでした。

JSON配列オブジェクトを渡して、ajaxメソッド呼び出しを使用して.aspxページWebメソッドを呼び出したときにスローされました。Webページのメソッドシグネチャには、厳密に型指定された.NETオブジェクトの配列OrderDetailsが含まれていました。Actual_Qtyプロパティはintとして定義され、JSONオブジェクトActual_Qtyプロパティには "4"(余分なスペース文字)が含まれていました。余分なスペースを削除した後、変換が可能になり、Webページメソッドはajax呼び出しによって正常に到達しました。


0

IIS Expressの場合は、WebプロジェクトのサーバープロパティをローカルIISとして設定してみてください。プロジェクトのURLが正しいかどうかを確認し、仮想ディレクトリを作成します。


0

Uniform Resource Locator(URL)を扱う場合、特定の構文標準があります。この特定の状況では、予約文字を扱います。ます。

までのようにRFC 3986、(またはしない場合があります)予約文字は、各方式固有の構文によって、またはURIの逆参照アルゴリズムの実装固有の構文により、一般的な構文によって区切り文字として定義されます。また、アスタリスク(*)は予約文字です。

ベストプラクティスは、予約されていない文字を使用することです、URLですることです。または、エンコードしてみることもできます。

掘り続ける:


1
このエラーは、URLの予約文字をパーセントエンコードされた場合など、発生し、%25代わりに%にも発生するため、IISは完全に有効なURLに対してこのエラーを返す場合があります。
フロリアン冬
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.