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

我使用 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. 我在这里所做的事情会保护我免受 跨站脚本攻击?
  2. 还有其他考虑因素吗 那应该做吗?
  3. 白名单是否有良好的普通标签列表?
有帮助吗?

解决方案

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

但这还远远不够。例如目前 <a href="..."> 或者 <img src="..." /> 不允许。如果您想允许这些或其他带有属性值的标记,您将需要做更多的工作。然后,您可以使用正则表达式来处理它,但这会给您带来无尽的问题,即意外嵌套和替换已替换的内容,就像正则表达式无法解析 HTML 一样。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top