web-dev-qa-db-ja.com

「潜在的に危険なRequest.Form値がクライアントから検出されました」というエラーが表示されるのはなぜですか?

「インターネットアプリケーション」テンプレートを使用して、新しいASP.NET MVC 3/.NET Framework 4.0サイトを作成しました。 Nugetを使用して Windows Azure Web Role(MVC3) パッケージをインストールし、次に Access Control Serviceウォークスルー に従ってWindows Live IDとGoogle認証をセットアップしました。

すぐに、「潜在的に危険なRequest.Form値がクライアントから検出されました」というエラーに遭遇し、 Windows Identity Foundation wikiの記事 を試して解決しました。残念ながら、私が試したことは何もありません。

  • ルートweb.configとViews\web.configの両方で<httpRuntime requestValidationMode="2.0"/><pages validateRequest="false">を設定する

  • SampleRequestValidatorをWIF SDKからプロジェクトにコピーし、両方のweb.configsで<httpRuntime requestValidationType="SampleRequestValidator"/>を設定する

これらのバリエーションも試しましたが、成功しませんでした。

何かアイデアはありますか?

ここに完全な例外があります:


例外の詳細:System.Web.HttpRequestValidationException:潜在的に危険なRequest.Form値がクライアントから検出されました(wresult = "<t:RequestSecurityTo...") 。

説明:リクエストの検証により、潜在的に危険なクライアント入力値が検出され、リクエストの処理が中止されました。この値は、クロスサイトスクリプティング攻撃など、アプリケーションのセキュリティを侵害する試みを示している可能性があります。ページがアプリケーションリクエストの検証設定を上書きできるようにするには、httpRuntime構成セクションのrequestValidationMode属性をrequestValidationMode = "2.0"に設定します。例:<httpRuntime requestValidationMode="2.0" />。この値を設定した後、Pageディレクティブまたは<pages>構成セクションでvalidateRequest = "false"を設定することにより、リクエストの検証を無効にできます。ただし、この場合、アプリケーションですべての入力を明示的にチェックすることを強くお勧めします。詳細については、 http://go.Microsoft.com/fwlink/?LinkId=1531 を参照してください。

スタックトレース:

[HttpRequestValidationException(0x80004005):潜在的に危険なRequest.Form値がクライアントから検出されました(wresult = "<t:RequestSecurityTo...")。]

 System.Web.HttpRequest.ValidateString(String value、String collectionKey、RequestValidationSource requestCollection)+8755668 
 System.Web.HttpRequest.ValidateNameValueCollection(NameValueCollection nvc、RequestValidationSource requestCollection)+122 
 System.Web.HttpRequest.get_Form()+114 
 Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.IsSignInResponse(HttpRequest request)+75 
 Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.CanReadSignInResponse(HttpRequest request、Boolean onPage)+205 
 Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.CanReadSignInResponse(HttpRequest request)+41 
 Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.OnAuthenticateRequest(Object sender、EventArgs args)+117 
 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+148 
 System.Web.HttpApplication.ExecuteStep(IExecutionStep step、Boolean&completedSynchronously)+75 [.___ _。]

21
Alex Angas

[ValidateInput(false)] 属性を使用して、投稿先のコントローラアクション(およびこの例外をスローするアクション)を(を離れる<httpRuntime requestValidationMode="2.0"/> in web.config)。

18
Darin Dimitrov

私も同じ問題を抱えていました。

これが私の解決策の例です:

 [ValidateInput(false)]

    public ActionResult *YourMethodName*(FormCollection forms)
    {
          // Encoded String
          string EncodedValue = Server.HtmlEncode(forms[*name or index*]);

         // Normal String 
         string value = forms[*name or index*]

         //.... 
    }

Webconfigには何も必要ありません。

16
Marco Ramos

私はこれについて小さなブログのメモを書きました: http://erikbra.wordpress.com/2012/04/17/wif-saml-token-post-and-requestvalidationmode2-0/ 。リクエストの検証をオフにする必要はなく、サイト全体で2.0に設定する必要もありません。

つまり、WIFがSAMLトークンをポストバックする特定のURLでrequestValidationModeを2.0モードに変更するだけです。これは、次のように、web.configの要素(詳細については、location要素(ASP.NET設定スキーマ)を参照)を使用して実行できます。

<location path="WIFHandler">
  <system.web>
    <httpRuntime requestValidationMode="2.0" />
  </system.web>
</location>

ASP.NETが要求を処理しようとする前にWIFがパイプラインをショートカットし、戻りURL(ruwctx SAMLトークンのパラメータ(POST)を代わりに使用します。

Web.configファイルのWIF構成セクションで、「reply」パラメーターをリクエスト検証モードを2.0モードに設定した場所と必ず一致させます。

<Microsoft.identityModel>
    <service>
      <federatedAuthentication>
        <wsFederation passiveRedirectEnabled="true" 
                      issuer="https://localhost/STS/" 
                      realm="https://localhost/MyApp/"
                      reply="https://localhost/MyApp/WIFHandler/" />

(...)
13

まず、これがどこから来ているのかを絞ります。フィドラーを使用して、問題の原因となっているフィールドを調査します。アイテムが次のように単純な場合:<sは、エンコードされずにポストされたときにこのエラーを引き起こします。また、[AllowHtml]属性を使用してモデルを装飾し、2.0エンコーディングを有効にしないこともできます。これは少し危険です。

2

ここでこれについて言及している答えはありません。だからここに行く。

"[ValidateInput(false)]"に加えて、aspxで、これを<%@ Page ...>に追加する必要がある場合があります。

<%@ Page ValidateRequest="false">

これにより、Webアプリ全体ではなく、ページごとにリクエストの検証を無効にすることができます。

2
Jach

SampleRequestValidatorをWIF SDKからプロジェクトにコピーし、両方のweb.configsで設定

これで修正されます。コードが実際に実行されていることを確認できますか?リクエストバリデーターにブレークポイントを配置すると、ヒットしますか?

<httpRuntime...><system.web> 正しい?

2
Eugenio Pace

「Active DirectoryからWindows Azureアプリケーションへのシングルサインオン」チュートリアルを実行しているときにこの問題に遭遇しました。私の場合、問題は誤って<httpRuntime ... />値をweb.configファイルの間違った<system.web />セクションに配置したことでした(最初はこれに気付きませんでしたが、新しい<location>セクションには、 "FederationMetadata"のパスがあり、system.webも含まれています。)値は、トップレベルの<system.web>セクションに配置する必要があります。

1
NateTheGreat

一見すると、Azure Mvc3ライブラリのバグのように見えます。 MVC 3は、Formコレクションから未検証の値を取得できる特別なAPIを公開していますが、モジュールはそれらを使用していないようです。

0
marcind