1

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

我正在使用 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 回答 1

2

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

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

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

于 2010-01-20T20:28:13.347 回答