2010-01-20 59 views
1

我在这里做什么有什么问题吗?这是我第一次处理这样的事情,我只是想确保我理解所有风险等不同的方法。白名单,防止在C#中使用WMD控制XSS

我正在使用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. 是否有正常的 标签到白名单的好名单?
+0

该代码将不适用于“IMG”标签,因为替换“<img>”不允许“src”属性“ – David 2010-01-20 20:23:56

回答

2

如果你的要求真的是基本的,你可以做这么简单的字符串替换,那么是的,这对XSS是“安全的”。 (但是,它仍然可以提交非形成井的内容,其中<i><b>是错误的嵌套或不封闭,这可能会搞乱了内容最终页插入。)

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

为了解决这两个问题,通常的方法是在输入上使用[X] [HT] ML分析器,然后遍历DOM去除所有已知好的元素和属性,最后重新串行为[X ] HTML。结果保证格式正确并且只包含安全内容。

+0

因此,假设我想要更强大的东西,您会为你提到的解析器?HTML敏捷包可以处理它吗? 是不是有所有这一切已经完成? – Jason 2010-01-20 20:36:27

+0

是的,HTML敏捷包是一个不错的选择。一旦你解析了DOM,这是一个相对简单的练习,写一个递归函数可以从DOM树中删除所有已知好的元素/属性,并且如果你允许'href' /'src'/etc,记得检查已知好的方案的URL,例如'http' /'https' ,以避免通过'javascript:'URL注入等。 – bobince 2010-01-20 20:58:14