1

私がここでしていることに何か問題はありますか?このようなことを扱うのは初めてですが、さまざまな方法のリスクなどをすべて理解していることを確認したいと思います。

WMDを使用してユーザー入力を取得し、リテラルコントロールで表示しています。入力すると編集できないので、マークダウンではなくHTMLを保存します。

input = Server.HTMLEncode(stringThatComesFromWMDTextArea)

次に、ユーザーが使用できるようにしたいタグに対して、次のようなものを実行します。

// Unescape whitelisted tags.
string output = input.Replace("&lt;b&gt;", "<b>").Replace("&lt;/b&gt;", "</b>")
                     .Replace("&lt;i&gt;", "<i>").Replace("&lt;/i&gt;", "</i>");

編集これが私が現在行っていることです:

 public static string EncodeAndWhitelist(string html)
 {
     string[] whiteList = { "b", "i", "strong", "img", "ul", "li" };
     string encodedHTML = HttpUtility.HtmlEncode(html);
     foreach (string wl in whiteList)
         encodedHTML = encodedHTML.Replace("&lt;" + wl + "&gt;", "<" + wl + ">").Replace("&lt;/" + wl + "&gt;", "</" + wl + ">");
     return encodedHTML;
 }
  1. ここで私がしていることは、XSSから私を保護し続けますか?
  2. 他に考慮すべき点はありますか?
  3. ホワイトリストに登録する通常のタグの適切なリストはありますか?
4

1 に答える 1

2

要件が本当にそのような単純な文字列置換を実行できるほど基本的なものである場合は、そうです。これはXSSに対して「安全」です。(ただし、整形式ではないコンテンツを、誤ってネストされているか閉じられていない場所に送信する<i>こと<b>は可能です。これにより、コンテンツが挿入されるページが混乱する可能性があります。)

しかし、これで十分なことはめったにありません。たとえば、現在<a href="...">または<img src="..." />許可されていません。これらまたは属性値を含む他のマークアップを許可したい場合は、さらに多くの作業を行う必要があります。次に、正規表現を使用してアプローチすることもできますが、正規表現がHTMLを解析できないことを考えると、誤ってネストしたり、既に置き換えられたコンテンツを置き換えたりするという問題が無限に発生します。

両方の問題を解決するための通常のアプローチは、入力で[X] [HT] MLパーサーを使用し、DOMをウォークして、正常な要素と属性を除くすべてを削除し、最後に[X]HTMLに再シリアル化することです。結果は整形式であることが保証され、安全なコンテンツのみが含まれます。

于 2010-01-20T20:28:13.347 に答える