web-dev-qa-db-ja.com

ValidateInput(false)vs AllowHtml

メモを作成するためのフォームがあります。リッチテキストエディターを使用してスタイリングを行います。これにより、スタイルを適用するためにhtmlタグが作成されます。そのテキストを投稿すると、mvcは潜在的に危険なスクリプトを防ぐためにエラーをスローするので、具体的に許可する必要があります。

これを行うには2つの方法があります。1つは[ValidateInput(false)]でコントローラーメソッドを修飾する方法、もう1つはViewModel属性を_[AllowHtml]_で修飾する方法です。私には、_[AllowHtml]_の方がはるかに良いように見えますが、このアプローチは1回しか使用されておらず、[ValidateInput(false)]が好ましい方法であるようです。

どの方法を使用する必要があり、2つの違いは何ですか?

46
EricGS

ValidateInputとAllowHTMLは [〜#〜] xss [〜#〜] セキュリティの問題で直接接続されています。

それでは、まずXSSを理解してみましょう。

XSS(クロスサイトスクリプティング)は、データ入力中に攻撃者が悪意のあるコードを注入するセキュリティ攻撃です。幸いなことに、MVCではXSSがデフォルトで防止されています。そのため、JavaScriptまたはHTMLコードを投稿しようとすると、次のエラーが発生します。

Enter image description here

しかし、リアルタイムでは、HTMLエディターのように、HTMLを許可する必要があるシナリオがあります。そのため、このようなシナリオでは、以下の属性を使用してアクションを装飾できます。

[ValidateInput(false)]
public ActionResult PostProduct(Product obj)
{
    return View(obj);
}

ただし、ここで問題が発生します。問題は、完全なアクションで危険なHTMLを許可していることです。したがって、フィールドまたはプロパティレベルでよりきめ細かな制御を行うことができれば、きちんと整理されたプロフェッショナルなソリューションを実際に作成できます。

そこで、AllowHTMLが役立ちます。製品クラスのプロパティレベルで「AllowHTML」を装飾したコードを以下に示します。

public class Product
{
    public string ProductName { get; set; }
    [AllowHtml]
    public string ProductDescription { get; set; }
}

したがって、「ValidateInput」を要約すると、「AllowHTML」がより詳細なレベルである間に、スクリプトとHTMLをアクションレベルでポストできます。

アクション全体を裸にする必要があることが確実になるまで、「AllowHTML」をさらに使用することをお勧めします。

ブログの投稿ValidateInputとAllowHTMLを使用したASP.NET MVCでのXSS攻撃の防止を読むことをお勧めします。例と2つの属性。

112

bind Includeを使用する最良の方法がAllowHtmlである場合は、ValidateInput(false)を使用してcontrollのすべてのValidatonを無効にすることができます。

0
pejman mirzaee