2017-03-09 3 views
0

XSSを気にせずに符号化された文字列を保存できるように、私はAntiXssEncoder.HtmlEncodeを使用して悪質な入力から文字列プロパティをサニタイズするモデルバインダを作成しました。だから私はこの仕事をしましたが、私が抱えている唯一の問題は、アンチXssで文字列プロパティをデコードする方法です。Viewモデルをオーバーライドして文字列をサニタイズする

enter image description here

私はページが<test> meにテキストの代わりに、上の画像をレンダリングする:下記参照として

ページでは、このテキストをレンダリングします。私はこれを行うためにいくつかのリソースを調べようとしましたが、ビュー内の文字列に拡張メソッドを追加することでこれを実現できます。しかし、これは退屈なことです。私は、ページ上にレンダリングする前に、モデル内の文字列プロパティを自動的にサニタイズする何かをグローバルに設定したいと思います。

誰もが自動的に文字列サニタイズを実装する方法を提案したり、ビューモデルをオーバーライドしたり、文字列のプロパティをチェックしたり、ページをレンダリングする前にサニタイズしたりできますか?

更新: または私はActionResult

public ActionResult Test() 
{ 
    return View(model); 
} 

答えて

2

あなたのコードは、それはあなたがあなたのモデルバインダーを実装しているかに依存しますデコードされていないという事実のこの部分をオーバーライドすることができます方法。

通常、デコードするにはHttpUtility.Decodeを使用するだけなので、これをどこかで実行する必要があります。

[AllowHtml]属性をモデルプロパティに配置する必要がある場合があります。

また、IHtmlStringを実装する必要があるかもしれません。ToHtmlString()メソッドを使用すると、自動的にMVCを消さずにページに直接HTMLを置くことができます。

おそらくもっとコードがあればそれは明確になりますが、その3つのうちの1つが正しい方向に向けるべきです。

+0

モデルバインダーの実装では、文字列のプロパティをエンコードするだけで、モデルで文字列プロパティをグローバルにデコードしてからページに表示することができます。私はあなたの3つのソリューションを使用することができることを知っているが、それは私が避けているそれぞれのプロパティにそれらを定義しなければならないことを意味するだろう。 – rpmansion

+0

すべての文字列を 'IHtmlString'として定義するか、または何らかの方法でひらめきビューエンジンをオーバーライドする以外に、これをグローバルに行う方法を見つけることができません。私は実際のレンダリング部分の実装を見つけることができませんでした(恐ろしく複雑になると思われます)。モデルバインディングの一部として文字列をデコードするアクションをアトリビュートに設定する(またはグローバルアトリビュートを定義する)ことができます。これについてはこちらをご覧くださいhttps://github.com/CypressNorth/.NET-WebApi-HttpStringDecodeFilter – NibblyPig

+0

Iそれを見た。私はそれを試みようとしていた。この技法を使ってこの進展がどのように進行するか見てみましょありがとう – rpmansion

関連する問題