0

フォームに「説明」フィールドがあります。ユーザーがこのフィールドで特殊文字を使用することを制限されないようにしたいと思います。

そのため、次のデータをクライアントからサーバーにPOSTし、データベースに保存して、再度正しくレンダリングできるようにしたいと思います。

テストの説明( &&%$ ^ ^()^ && $& 87566467679089765?<>?<>?<>?<> ":";';';'] [] [] [] [{} {} {}

私はこのテーマについていくつか読んだのですが、予想よりも多くの選択肢があるようです。セキュリティのために、これを適切に行うようにしたいと思います。

私のモデルでは、DescriptionプロパティにAllowHtml属性のタグを付けました。

[DisplayFormat(ConvertEmptyStringToNull = false), AllowHtml]
public string Description { get; set; }

これにより、上記のデータをコントローラーにPOSTできますが、問題の核心には対処していません。私は今、自分の入力をサニタイズする必要があると信じています。これは、HttpUtilityライブラリを活用する必要があることを意味すると思います。

HttpUtilityを見ると、たくさんのメソッドがあります。

  • HtmlAttributeEncode
  • HtmlEncode
  • UrlEncode

この投稿によると、HtmlEncodeとUrlEncodeの間に大きな違いはないようです。

私はいくつかのことを疑問に思っています:

  • ここでは、HttpUtilityを使用するのが正しい選択ですか?
  • POSTする前に入力の処理を行わなくても問題ありませんか?(すべてのエンコーディングをサーバー側で実行できますか?)
  • HttpUtilityの代わりにMicrosoftのanti-xssライブラリを使用する必要がありますか?

そして、一般的に、私がプライバシーを守られなかったかもしれない他の落とし穴。

アップデート:

これが私のモデルです:

<div class="detailsRow optional">
    <%= Html.LabelFor(model => model.Description, new { @class = "descriptionLabel" }, Model.DescriptionLabel)%>
    <%= Html.TextAreaFor(model=> model.Description) %>
</div>

と私のコントローラーメソッド:

public ActionResult SaveNewOrderDetails(NewOrderDetailsModel orderDetailsModel)
{
    string description = orderDetailsModel.Description;
    //Successfully got description
    //Example code:
    Order order = new Order(description);
    order.Save();

    return Json(new { id = order.ID, name = order.Name });
}

コードが「returnJson」ステートメントを通過した後、別のエラーが表示されます。

潜在的に危険なRequest.Form値がクライアントから検出されました(Description = "...>?<>?<>?<> <?>": ";';';'] [] [][][。 .. ")。

私の理解では、これは発生してはならないということです。チェックすべき場所はありますか?

UPDATE2 :AllowHtmlを機能させることができませんMVC4にアップグレードするときに、これを再検討します。

4

1 に答える 1

2

私は今、自分の入力をサニタイズする必要があると信じています。

いいえ、ユーザー入力を受け取り、それをデータベースに保存することに関しては問題ありません(常に実行する必要のあるパラメーター化されたクエリを使用したと仮定します)。この[AllowHtml]属性を使用すると、任意の文字を入力できます。ユーザーが入力できる文字をサニタイズしたい場合は、正規表現バリデーターを使用するだけです(私はおそらくそれを気にしないでしょう):

[DisplayFormat(ConvertEmptyStringToNull = false)]
[AllowHtml]
[RegularExpression("PUT YOUR REGEX HERE")]
public string Description { get; set; }

データベースから読み取った値をビューにレンダリングするときは注意が必要です。常にHTMLでエンコードするようにしてください。たとえば、<%:関数は箱から出してそれを行います。

それで、これを表示する安全な方法は次のとおりです。

<div>
    <%: Model.Description  %>
</div>

絶対にしないように注意してください。

<div>
    <%= Model.Description  %>
</div>

これは出力をHTMLエンコードせ、サイトがXSSに対して脆弱になるためです。

そして、DisplayForヘルパーを使用する別の安全な方法は次のとおりです。

<div>
    <%= Html.DisplayFor(x => x.Description) %>
</div>

また、これを編集可能なフィールドまたはテキスト領域にレンダリングする場合は、対応するヘルパーを使用するだけです。

<div>
    <%= Html.TextAreaFor(x => x.Description) %>
</div>
于 2013-01-11T17:24:28.737 に答える