web-dev-qa-db-ja.com

ValidateInput(False)が機能しないのはなぜですか?

Webフォームを使用して作成したアプリケーションを、vb.netを使用してasp.net mvcフレームワークに変換しています。私の見解の1つに問題があります。フォームを送信すると、「クライアントから、潜在的に危険なRequest.Form値が検出されました」という黄色の死の画面が表示されます。私はtinymceをRTEとして使用しています。ビュー自体を設定しました

ValidateRequest = "false"

MVCでは、これまでに読んだことから、それを尊重しないことは知っています。だから私はそれをコントローラーアクションにも入れました。私はさまざまな設定を試しました:

<ValidateInput(False), AcceptVerbs(HttpVerbs.Post)> _

...そして...

<AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _

...そしてこのように...

<ValidateInput(False)> _
<AcceptVerbs(HttpVerbs.Post)> _

それが違いを生んだかどうかを見るためだけに、まだ死の黄色の画面が表示されます。このビューと、自分の投稿が関係するコントローラーの特定のアクションに対してのみ設定します。何か不足していますか?

34
Dekryptid

ポストされているコントローラーアクションが、あなたが属性を持っているものであることを確信していますか?

17
Chad Moran

Asp.net 4では、web.configでも検証モードを構成する必要があります。

以下を<system.web>要素の子として設定します。

<system.Web>
  ...
  <httpRuntime requestValidationMode="2.0"/>     

Asp.Net 4は、デフォルトでrequestValidationModeを4.0に設定します。これは、HTTPリクエストのBeginRequstフェーズの前にリクエストの検証を実行するようにシステムに指示します。検証は、システムがアクション属性に到達してリクエストを検証しないように指示する前に行われるため、属性は使用できなくなります。 requestValidationMode = "2.0"を設定すると、asp.net 2.0リクエスト検証動作に戻り、ValidateInput属性が期待どおりに機能するようになります。

133
Jim Geurts

IModelBinderインターフェイスを実装する独自のモデルバインダーを使用している場合、属性に関係なく、これらのカスタムモデルバインダーは常にデータを検証します。数行のコードを追加して、カスタムモデルバインダーにアクションのValidateInputフィルターを尊重させることができます。

// First check if request validation is required
var shouldPerformRequestValidation = controllerContext.Controller.ValidateRequest && bindingContext.ModelMetadata.RequestValidationEnabled;

// Get value
var valueProviderResult = bindingContext.GetValueFromValueProvider(shouldPerformRequestValidation);
if (valueProviderResult != null)
{
    var theValue = valueProviderResult.AttemptedValue;

    // etc...
}

これは、Martijn Bolandによって非常にうまく説明されています: http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/

3
Rahatur

HttpContext.Request.Unvalidated.Form ["FieldName"]のようなフィールドにアクセスしてみることができます

2
Chitta

これらの提案は、FormCollectionと組み合わせて[ValidateInput(false)]を使用する必要があるときに発生するバグによって引き起こされる問題を修正しないことに注意してください。

参照: ASP.NET MVC 3 ValidateRequest(false)がFormCollectionで機能しない

1

入力モデルを使用し、必要なプロパティでAllowHtmlを使用すると、ブロックが解除されます。

public class InputModel
{
    [AllowHtml]
    public string HtmlInput { get; set; }
}

...
[ValidateInput(false)]
public async Task<ActionResult> ControllerMethod(InputModel model)
{
}
0
Tarek Ayna