2012-03-21 3 views
7

これに関連するquestion私はASP.NET MVCプロジェクトでXSSの問題を抱えています。私はMvcHtmlSTring.ToHtmlString()メソッドと混同しています。 documentationから「現在のオブジェクトを表すHTMLエンコードされた文字列を返します」、それは私の場合は仕事doesn't:mvcHtmlStringMvcHtmlString.ToHtmlString()はHTMLをエンコードしていませんか?

<SCRIPT/XSS SRC="htpp://ha.ckers.org/css.js"> 

<をエンコードの出力の

var mvcHtmlString = MvcHtmlString.Create("<SCRIPT/XSS SRC=\"htpp://ha.ckers.org/css.js\">").ToHtmlString(); 

    var encoded = HttpUtility.HtmlEncode("<SCRIPT/XSS SRC=\"htpp://ha.ckers.org/css.js\">"); 

出力を - - これは私が疑う行動です!

&lt;SCRIPT/XSS SRC=&quot;htpp://ha.ckers.org/css.js&quot;&gt; 

私は何かを見逃しましたか?すなわちMvcHtmlStringあなたが実際にこれらのHTMLタグをしたいということを言っていることを行うことで -

答えて

8

MvcHtmlString(またはHtmlString、またはIHtmlStringを実装して何でも)HTML逐語として放出されるべき文字列です。

違いは、<%: .. %>(ASP.NET 4以降の新機能)を使用して文字列をASP.NETページに出力する場合です。その場合、ASP.NETエンジンは自動的に通常の文字列をHtmlEncode(またはIHtmlStringを実装していないもの)に変換しますが、MvcHtmlStringはそのままの状態またはunencodedに出力されます。

つまり、ドキュメントが間違っていると思います。 connect ticketには、HtmlStringコンストラクターのドキュメントに相当するエラーがあり、修正されています。 (私はそれを提出したと思った: - /多分私の人は他の人の複製として閉じられた?)私はMvcHtmlStringのドキュメントも間違っていた気づいていない。

+0

ドキュメントの問題のみなら、ToHtmlStringメソッドの目的は何ですか?私の例では、 "ToHtmlString()"メソッドと "ToString()"メソッドを呼び出す間に違いはありません。どちらもエンコードされていない悪いHTMLを出力します。 –

+0

[IHtmlString](http://msdn.microsoft.com/en-us/library/system.web.ihtmlstring.aspx)インターフェイスのメソッドです。これは実際には「ページに挿入するHTMLコンテンツを返す」ことを意味します。つまり、これはASP.NET MVC 4が呼び出してさらにエンコードすることなく結果を出力することを意味します。私は他のクラスでは違うことをすることができると思いますが、違いはありません。 – Rup

8

MSDNのドキュメントは正しくありますが、おそらく少し混乱します。 MvcHtmlStringおよびIHtmlStringインターフェイスは、がすでににエンコードされた文字列を表すために使用されます。 MSDNは

現在のオブジェクトを表すHTMLエンコードされた文字列を返します。

あなたはMvcHtmlStringオブジェクトに渡されたオブジェクトがすでにHTMLエンコードされたので、両方.ToString().ToHtmlString()単にあなたが渡されたオブジェクトを返す

MSDNのドキュメントは明らかにそれを述べるないことに注意してください:。

ToHtmlStringメソッドとToStringメソッドは同じ値を返します。

だからこそすべての理由はありますか?二つの理由:かみそりビューエンジンにおいてとIHtmlStringを実装するオブジェクトV4 ASP.NET Webフォームで

  1. が生データとして書き出されます。ビューエンジンは、IHtmlStringを作成している人物が既にデータをサニタイズしていることを前提としています。
  2. IHtmlStringには独自のstringifyメソッドがあり、ToString()と同じ実装を持つ必要はありません。ToHtmlString()はHTMLを返さなければなりませんが、ToString()は開発者にやさしいデバッグ情報を返すかもしれません。
+0

IMOは "HTMLコンテンツの文字列を返します":必ずしもHTMLでエンコードされた文字列ではなく、OPの誤解を招くようなエンコーディングに言及しています。ここで改善の余地があると思います。特に、同じ値の注釈(これはMvcHtmlStringドキュメントで、HtmlStringではない)は、これが変換されていないオブジェクトを構築するために使用される値であることを明確にする必要があります。 – Rup

関連する問題