白名单,通过 C# 中的 WMD 控制防止 XSS
题
我在这里做的事情有什么问题吗?这是我第一次处理这样的事情,我只是想确保我了解所有风险等。到不同的方法。
我使用 WMD 获取用户输入,并使用文字控件显示它。由于一旦输入就无法编辑,我将存储 HTML 而不是 Markdown,
input = Server.HTMLEncode(stringThatComesFromWMDTextArea)
然后对我希望用户能够使用的标签运行如下所示的内容。
// Unescape whitelisted tags.
string output = input.Replace("<b>", "<b>").Replace("</b>", "</b>")
.Replace("<i>", "<i>").Replace("</i>", "</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("<" + wl + ">", "<" + wl + ">").Replace("</" + wl + ">", "</" + wl + ">");
return encodedHTML;
}
- 我在这里所做的事情会保护我免受 跨站脚本攻击?
- 还有其他考虑因素吗 那应该做吗?
- 白名单是否有良好的普通标签列表?
解决方案
如果您的要求确实非常基本,您可以进行如此简单的字符串替换,那么是的,这对于 XSS 是“安全的”。(但是,仍然可以提交格式不正确的内容,其中 <i>
和 <b>
错误嵌套或未关闭,这可能会弄乱内容最终插入的页面。)
但这还远远不够。例如目前 <a href="...">
或者 <img src="..." />
不允许。如果您想允许这些或其他带有属性值的标记,您将需要做更多的工作。然后,您可以使用正则表达式来处理它,但这会给您带来无尽的问题,即意外嵌套和替换已替换的内容,就像正则表达式无法解析 HTML 一样。
为了解决这两个问题,通常的方法是在输入上使用 [X][HT]ML 解析器,然后遍历 DOM,删除除已知良好的元素和属性之外的所有元素和属性,最后重新序列化为 [X]HTML。然后保证结果格式良好并且仅包含安全内容。
不隶属于 StackOverflow