C# 白名单,在C中使用WMD控件防止XSS#
我在这里的工作有什么问题吗?这是我第一次处理这样的事情,我只是想确保我了解不同方法的所有风险等 我使用WMD获取用户输入,并使用文字控件显示它。 因为一旦输入就不可编辑,所以我将存储HTML而不是降价C# 白名单,在C中使用WMD控件防止XSS#,c#,asp.net,xss,wmd,whitelist,C#,Asp.net,Xss,Wmd,Whitelist,我在这里的工作有什么问题吗?这是我第一次处理这样的事情,我只是想确保我了解不同方法的所有风险等 我使用WMD获取用户输入,并使用文字控件显示它。 因为一旦输入就不可编辑,所以我将存储HTML而不是降价 input = Server.HTMLEncode(stringThatComesFromWMDTextArea) 然后对我希望用户能够使用的标记运行类似以下的操作 // Unescape whitelisted tags. string output = input.Replace("&
input = Server.HTMLEncode(stringThatComesFromWMDTextArea)
然后对我希望用户能够使用的标记运行类似以下的操作
// Unescape whitelisted tags.
string output = input.Replace("<b>", "<b>").Replace("</b>", "</b>")
.Replace("<i>", "<i>").Replace("</i>", "</i>");
//Unescape白名单标记。
字符串输出=输入。替换(“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;
}
publicstaticstringencodeandwhitelist(字符串html)
{
字符串[]白名单={“b”,“i”,“strong”,“img”,“ul”,“li”};
字符串encodedHTML=HttpUtility.HtmlEncode(html);
foreach(白名单中的字符串wl)
encodedHTML=encodedHTML.Replace(“+wl+”,”).Replace(“/”+wl+”,”);
返回编码DHTML;
}
如果您的需求真的那么基本,您可以进行简单的字符串替换,那么是的,这对XSS是“安全的”。(但是,如果
和
嵌套错误或未关闭,仍然可以提交格式不正确的内容,这可能会导致插入内容的页面混乱。)
但这还远远不够。例如,当前不允许使用
或
。如果您想允许在中使用这些或其他带有属性值的标记,则需要做大量的工作。然后,您可能会使用regex进行处理,但这会给您带来无数的问题,比如意外嵌套和替换已经替换的内容,比如regex无法解析HTML等等
为了解决这两个问题,通常的方法是对输入使用[X][HT]ML解析器,然后遍历DOM除去所有已知良好的元素和属性,最后重新序列化为[X]HTML。然后保证结果格式正确且仅包含安全内容。该代码不适用于“IMG”标记,因为替换“IMG”不允许使用“src”属性“。那么,假设我想要更健壮的东西,你会对你提到的解析器提出什么建议?HTML Agility Pack可以处理吗?是的,HTML敏捷包是一个不错的选择。解析DOM之后,编写一个递归函数,从DOM树中删除除已知良好元素/属性外的所有元素/属性,这是一个相对简单的练习。另外,如果您允许
href
/src
/等,请记住检查URL以查找已知的好方案,如http
/https
,以避免通过javascript:
URL等进行注入。