web-dev-qa-db-ja.com

ユーザーがASP.NET MVCでHTMLを入力できるようにする-ValidateInputまたはAllowHtml

ユーザーがASP.net MVCを使用して特定のフィールドにHTMLを入力できるようにする方法を教えてください。

コントローラーのこの複雑なオブジェクトにマップされる多くのフィールドを持つ長いフォームがあります。

1つのフィールド(説明)でHTMLを許可し、後でHTMLを使用して自分の衛生状態を整えたいと思います。

114
Rabbi

次の属性を、HTMLを許可するコントローラーのアクション(投稿)に追加します。

[ValidateInput(false)] 

編集:Charlino コメントに従って:

Web.configで、使用する検証モードを設定します。 MSDN を参照してください:

<httpRuntime requestValidationMode="2.0" />

2014年9月編集:sprinter252 コメントに従って:

これで、[AllowHtml]属性を使用する必要があります。以下を参照してください MSDN

ASP.NET MVC 3アプリケーションの場合、モデルにHTMLをポストバックする必要がある場合、ValidateInput(false)を使用してリクエスト検証をオフにしないでください。次のように、モデルプロパティに[AllowHtml]を追加するだけです。

public class BlogEntry {
    public int UserId {get;set;}
    [AllowHtml] 
    public string BlogText {get;set;}
 }
156
Kelsey

プロパティの上の[AllowHtml]属性はどうですか?

126
cryss

モデルに追加:

using System.Web.Mvc;

そしてあなたの財産に

        [AllowHtml]
        [Display(Name = "Body")]
        public String Body { get; set; }

私のポイントからこのコードは、このエラーを回避する最善の方法です。 HTMLエディタを使用している場合、すでに制限されているため、セキュリティの問題はありません。

42
Eugene Bosikov

特定のプロパティに[AllowHtml]を追加することは、セキュリティレベルを下げることを提案するブログやコメントがたくさんあるため、推奨されない解決策です。

それを追加することにより、MVCフレームワークはコントローラーをヒットさせ、そのコントローラー内のコードを実行できるようにします。

ただし、コード、フィルターなどによって異なります。応答がどのように生成されるか、さらに別の同様のエラーを引き起こす可能性のある検証があるかどうかによって異なります。

いずれの場合でも、[AllowHtml]属性を追加するのが正しい答えです。これにより、コントローラーでhtmlをデシリアライズできます。ビューモデルの例:

[AllowHtml]
public string MessageWithHtml {get; set;}
9
iberodev

私は同じ問題に直面しましたが、いくつかの回答で説明されているように、関連するプロパティに[System.Web.Mvc.AllowHtml]を追加しました。

私の場合、RequestオブジェクトにアクセスするUnhandledExceptionFilterクラスがありますbeforeMVC検証が行われます(したがって、AllowHtmlは効果がありません)このアクセスは[HttpRequestValidationException] A potentially dangerous Request.Form value was detected from the clientを発生させます。

つまり、Requestオブジェクトの特定のプロパティにアクセスすると、暗黙的に検証(私の場合はParamsプロパティ)が起動されます。

検証を防ぐための解決策は MSDN で文書化されています

要求の特定のフィールド(たとえば、入力要素またはクエリ文字列値)の要求検証を無効にするには、次の例に示すように、アイテムを取得するときにRequest.Unvalidatedメソッドを呼び出します

したがって、このようなコードがある場合

var lParams = aRequestContext.HttpContext.Request.Params;
if (lParams.Count > 0)
{
  ...

に変更する

var lUnvalidatedRequest = aRequestContext.HttpContext.Request.Unvalidated;

var lForm = lUnvalidatedRequest.Form;
if (lForm.Count > 0)
{
  ...

または、検証を起動しないように見えるFormプロパティを使用します

var lForm = aRequestContext.HttpContext.Request.Form;
if (lForm.Count > 0)
{
  ...
6
ViRuSTriNiTy

action-method parameter(「モデルプロパティ」とは反対)のhtml入力を許可する必要がある場合、組み込みの方法はありませんが、カスタムモデルバインダーを使用してこれを簡単に実現します。

public ActionResult AddBlogPost(int userId,
    [ModelBinder(typeof(AllowHtmlBinder))] string htmlBody)
{
    //...
}

AllowHtmlBinderコード:

public class AllowHtmlBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var request = controllerContext.HttpContext.Request;
        var name = bindingContext.ModelName;
        return request.Unvalidated[name]; //magic happens here
    }
}

私のブログ投稿で完全なソースコードと説明を見つけてください: https://www.jitbit.com/alexblog/273-aspnet-mvc-allowing-html-for-particular-action-parameters/

2
Alex

データのURLエンコードは私にとっても機能します

例えば

var data = '<b>こんにちは</ b>'

ブラウザで、ポストする前にencodeURIComponent(data)を呼び出します

サーバーでHttpUtility.UrlDecode(received_data)を呼び出してデコードします

これにより、どのフィールド領域にhtmlを許可するかを正確に制御できます

1
smjhunt

NopCommerceを使用したEコマースサイトの開発中にこの問題に直面しましたが、以前の回答のように3つの異なる方法でこのソリューションを得ました。しかし、NopCommerceの構造によれば、これら3つは一度に見つかりませんでした。私はちょうど彼らが[AllowHtml]だけを使用していることを見ましたが、問題を除いてそれはうまく機能しています。以前に尋ねたように 質問

個人的には[ValidateInput(false)]を好まない。なぜなら、私は安全ではない合計モデルエンティティチェックをスキップしているからだ。しかし、誰かが ここを見てください

[AllowHtml] 
public string BlogText {get;set;}

次に、単一のプロパティのみをスキップし、特定のプロパティのみを許可し、他のすべてのエンティティをほとんどチェックしません。したがって、私の方が望ましいようです。

1
gdmanandamohon

私の場合、OutputCacheアクションフィルターと組み合わせると、AllowHtml属性は機能しませんでした。 この答え 私のために問題を解決しました。これが誰かを助けることを願っています。

1
jd4w9