私はやや自明のエラーを受けています。
クライアントから潜在的に危険なRequest.Path値が検出されました(*)。
問題はリクエストURLの*
が原因です。
https://stackoverflow.com/Search/test*/0/1/10/1
このURLは、「test *」が検索語で、残りのURLが他のさまざまなフィルタに関連する検索ページに入力するために使用されます。
URLでこれらの特殊文字を許可する簡単な方法はありますか?私はweb.config
を無駄に変更しようとしました。
特殊文字を手動でエンコード/デコードする必要がありますか?または、これを行うためのベストプラクティスがありますか、私はクエリ文字列を使用しないようにしたいと思います。 - しかしそれはオプションかもしれません。
アプリケーション自体は、ルーティングを使用して上記のNice URLを生成するc# asp.net
webformsアプリケーションです。
*
文字は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");
.NET 4.0を使用している場合は、web.configを介してこれらのURLを許可できるはずです。
<system.web>
<httpRuntime
requestPathInvalidCharacters="<,>,%,&,:,\,?" />
</system.web>
注意、アスタリスク(*)を削除したところです。元のデフォルトの文字列は次のとおりです。
<httpRuntime
requestPathInvalidCharacters="<,>,*,%,&,:,\,?" />
詳細については この質問 をご覧ください。
経路値をエンコードしてから(必要に応じて)検索前に値をデコードする必要があります。
私のために、私はWeb API 2.0で.net 4.5.2に取り組んでいます、私は同じエラーがあります、私はrequestPathInvalidCharacters = ""をrequestPathInvalidCharactersに追加することによってそれを設定しますこの問題を引き起こします。
<system.web>
<httpRuntime targetFramework="4.5.2" requestPathInvalidCharacters="" />
<pages >
<namespaces>
....
</namespaces>
</pages>
</system.web>
**これは良い習慣ではないことに注意してください。オブジェクトの属性が優れているか、特殊文字をエンコードするようにしてください。 - 残りのapiを設計するためのベストプラクティスを検索した後、検索、ソート、およびページネーションで、次のようなクエリパラメータを処理する必要があることがわかりました。
/companies?search=Digital%26Mckinsey
これにより、&をエンコードしてURL上のいずれかの方法で%26で置き換えたときに、サーバー上で正しいパラメーターDigital&Mckinseyを受け取ることで問題が解決します。
このリンクは残りのWeb APIの設計のベストプラクティスに役立つかもしれません https://hackernoon.com/restful-api-designing-guidelines-the-best-practices-60e1d954e7c9
WebプロジェクトのサーバープロパティをIIS Expressの場合はLocal IISに設定します。プロジェクトのURLが正しいかどうかを確認し、仮想ディレクトリを作成します。
Uniform Resource Locator(URL)を扱うときには 構文標準 がありますが、この特定の状況では予約文字を扱います。
RFC 3986 まで、予約文字は、一般的な構文、各方式固有の構文、またはURIの間接参照アルゴリズムの実装固有の構文また、アスタリスク(*)は予約文字です。
ベストプラクティスは、URLに 予約されていない文字 を使用することです。または、エンコードしてみることもできます。
掘り下げてください:
この例外は私のアプリケーションで発生し、やや誤解を招きました。
JSON配列オブジェクトを渡して、ajaxメソッド呼び出しを使用して.aspxページのWebメソッドを呼び出すときにスローされました。 Webページのメソッドシグネチャには、厳密に型指定された.NETオブジェクトOrderDetailsの配列が含まれていました。 Actual_Qtyプロパティはintとして定義され、JSONオブジェクトのActual_Qtyプロパティには "4"(余分なスペース文字)が含まれていました。余分なスペースを削除した後、変換が可能になり、Web Pageメソッドがajax呼び出しによって正常に到達しました。
私にとっては、URLを入力するときに、ユーザーが誤って/ではなく/を使用しました。クエリパラメータを開始するには
例えば。:
url.com/endpoint/parameter=SomeValue&otherparameter=Another+value
あるべきだった:
url.com/endpoint?parameter=SomeValue&otherparameter=Another+value