我在这里做的有什么问题吗?这是我第一次处理这样的事情,我只是想确保我了解不同方法的所有风险等。
我正在使用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;
}
答案 0 :(得分:2)
如果您的要求确实是基本的,那么您可以进行如此简单的字符串替换然后是,这对XSS是“安全的”。 (但是,仍然可以提交<i>
和<b>
错误嵌套或未关闭的非格式良好的内容,这可能会使内容最终插入的页面陷入混乱。)
但这已经不够了。例如,目前不允许<a href="...">
或<img src="..." />
。如果你想允许这些或其他带有属性值的标记,你还有很多工作要做。然后你可以使用正则表达式来处理它,但这会给你带来无意识的嵌套和替换已经被替换的内容的问题,看看正则表达式无法解析HTML,以及那个。
要解决这两个问题,通常的方法是在输入上使用[X] [HT] ML解析器,然后遍历DOM,删除所有已知良好的元素和属性,最后重新序列化为[X] HTML。结果保证格式良好,仅包含安全内容。