白名单,在C#中使用WMD控制防止XSS

时间:2010-01-20 20:02:24

标签: c# asp.net xss wmd whitelist

我在这里做的有什么问题吗?这是我第一次处理这样的事情,我只是想确保我了解不同方法的所有风险等。

我正在使用WMD来获取用户输入,我正在用文字控件显示它。 由于输入后它是不可编辑的,我将存储HTML而不是Markdown,

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 个答案:

答案 0 :(得分:2)

如果您的要求确实是基本的,那么您可以进行如此简单的字符串替换然后是,这对XSS是“安全的”。 (但是,仍然可以提交<i><b>错误嵌套或未关闭的非格式良好的内容,这可能会使内容最终插入的页面陷入混乱。)

但这已经不够了。例如,目前不允许<a href="..."><img src="..." />。如果你想允许这些或其他带有属性值的标记,你还有很多工作要做。然后你可以使用正则表达式来处理它,但这会给你带来无意识的嵌套和替换已经被替换的内容的问题,看看正则表达式无法解析HTML,以及那个。

要解决这两个问题,通常的方法是在输入上使用[X] [HT] ML解析器,然后遍历DOM,删除所有已知良好的元素和属性,最后重新序列化为[X] HTML。结果保证格式良好,仅包含安全内容。