白名单,防止XSS在C#WMD控制(Whitelisting, preventing XSS wit

2019-10-19 05:30发布

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

我使用大规模杀伤性武器,以获取用户输入的,而我用文字控制显示它。 因为它是不可编辑输入一次,我将存储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. 是否有正常的白名单标签的好名单?

Answer 1:

如果你的要求确实是基本的,你可以做这样简单的字符串替换,然后是的,这是“安全”对XSS。 (然而,它仍然是可能的,其中提交非形成阱内容<i><b>的误嵌套的或未封闭的,这有可能弄乱内容结束了的页面插入。)

但是,这是很少就够了。 例如目前<a href="..."><img src="..." />是不允许的。 如果你想允许这些或其他标记与属性值,你就会有一大堆工作要做。 然后,您可以用正则表达式接近它,而是让你有意外的嵌套和更换已经被替换的内容层出不穷的问题,看到正则表达式怎么也无法解析HTML,而且。

为了解决这两个问题,通常的做法是对输入使用[X] [HT] ML解析器,然后走DOM去除所有但已知良好的元素和属性,然后终于重新还原序列化到[X]的HTML。 然后将结果保证良好且只包含皆宜的内容。



文章来源: Whitelisting, preventing XSS with WMD control in C#