ValidateRequest =“ false”はAsp.Net 4では機能しません


156

私はckeditorを使用するフォームを持っています。このフォームはAsp.Net 2.0および3.5では正常に機能しましたが、Asp.Net 4以降では機能しません。ValidateRequest = "false"ディレクティブがあります。助言がありますか?


誰かが気にかけた場合に検証コントロールを適切にレンダリングすることに関する短い記事があります:.NET 4でのエラー検証
Ian

ValidationRequest = falseを使用する欠点は何ですか?
fc123 2014年

回答:


194

エラーページで解決策が見つかりました。requestValidationMode = "2.0"を追加するだけで十分

<system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime requestValidationMode="2.0" />
</system.web>

MSDN情報:HttpRuntimeSection.RequestValidationModeプロパティ


1
それは素晴らしいですが、誰かがこれをページごとに設定する方法を知っていますか?また、これをweb.configに入れて、.NET 2でも動作するようにするにはどうすればよいですか?
MK。

1
@MK:この設定にはページディレクティブがないと思います。.net 2で実行することはできません。必要はないと思います。なぜなら、1つのフレームワークバージョンのみを対象とするWebアプリを作成できるからです。この行を必要な.net 4 web.configにコピーするだけです
HasanG

2
しかし、.net 4の検証では何が変更されましたか?検証モードを変更せずにそれを行う方法はありますか?
Sly

4
:@Sly:あなたはここで答えを見つけることができますasp.net/learn/whitepapers/aspnet4/...
HasanG

誰でも、asp.net 4.0アプリケーションでrequestValidationMode = "2.0"を使用するのが良い考えである理由を教えてください。
fc123 2014年

102

1ページの検証を2.0に戻す方法があります。以下のコードをweb.configに追加するだけです。

<configuration>
    <location path="XX/YY">
        <system.web>
            <httpRuntime requestValidationMode="2.0" />
        </system.web>
    </location>

    ...
    the rest of your configuration
    ...

</configuration>

場所は任意のパスで、ツリーで指定したフォルダーの下のノードに基づいています。
DFTR、2011年

7
これは、アプリケーション全体ではなく、ロケーションパスで定義した特定のスコープに限定されないため、受け入れられた回答よりも優れたソリューションです
Charles Wesley

5
上記の<location ..>宣言は<configuration>宣言内に配置する必要がありますが、それ以上ネストすることはできません。
rbassett

1
.NET 4.6.1をターゲットとするプロジェクトでは、ページごとの設定が機能していないようです。
デニスT-モニカ復活

56

私は、これは古い質問ですけど、あなたはMVC 3でこの問題が発生した場合、あなたはあなたを飾ることができActionMethod[ValidateInput(false)]、ちょうど単一の要求の検証をオフにActionMethod便利です。また、web.configファイルを変更する必要がないため、.NET 4リクエストの検証を他の場所でも使用できます。

例えば

[ValidateInput(false)]
public ActionMethod Edit(int id, string value)
{
    // Do your own checking of value since it could contain XSS stuff!
    return View();
}

1
@RossCooperこれはasp.net MVC専用です
mxmissile 2018

28

これは、検証モードを変更せずに機能します。

System.Web.Helpers.Validation.Unvalidatedヘルパーを使用する必要がありますSystem.Web.WebPages.dllUnvalidatedRequestValues検証なしでフォームとQueryStringにアクセスできるオブジェクトを返します。

例えば、

var queryValue = Server.UrlDecode(Request.Unvalidated("MyQueryKey"));

MVC3と.NET 4で動作します。


1
このメソッドでqueryStringを取得する方法の例を教えていただけますか?「Unvalidated is a member of ...」というエラーメッセージが表示され続けます。インクルードが欠落している可能性があると思う
CodedMonkey

3
var queryValue = Server.UrlDecode(Request.Unvalidated( "MyQueryKey"));
sfuqua

1
これは間違いなく受け入れられる答えになるはずです。セキュリティを維持し、選択的に使用できるため、非常に柔軟です。
cmartin

Webフォームの場合、検証エラーを回避するためにQueryStringコレクションのエントリを置き換える必要があります
。jquerypost

15

別のアプローチは、4.0の検証動作を維持することですが、派生しRequestValidatorて設定する独自のクラスを定義することです。

<httpRuntime requestValidationType="YourNamespace.YourValidator" />

(どこYourNamespace.YourValidatorにあるか、推測できるはずです...)

このようにして、4.0sの動作の利点(特に、検証が処理の早い段階で行われる)を維持しながら、通過する必要のある要求を通過させることもできます。


7
これは知っておくと便利です。しかし、私はまだASP.Netのリクエスト検証機能全体が誤解していると思います。入力自体は問題ではありません、それはあなたそれで何をするかです。SQL、HTML、またはJavaScriptコードをアプリへの入力として受け入れることは、出力またはデータベースに格納する前に適切にエンコード/エスケープする限り、完全に有効です。
ジョーダンリーガー、2012

2
@JordanRieger部分的に同意します。OOTB、それは少なくともデフォルトで保護するという利点があります(物事を完全に考えないと、0wnedではなくエラーが発生します)が、それは少し厄介で、4.0より前の動作は非常にオールオアナッシングです。カスタムrequestValidationTypeの場合のように、他の処理の前に使用される検証レイヤーを持つ機能には何かがありますが、多くの検証を他の処理とより密接に関連付ける必要があります。全体として、良い習慣を奨励するよりも、悪い習慣を持つ人々を一部(すべてではない)のspl0itsから保護する方が効果的だと思います。
Jon Hanna
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.