我有一个简单的论坛应用程序,当有人发布任何内容时,我这样做:
post.Content = Sanitizer.GetSafeHtml(post.Content);
现在,我不确定我做错了什么,或者发生了什么,但它几乎不允许html。即使是简单的<b></b>
也太过分了。所以我想这个工具完全没用。
现在我的问题:任何人都可以告诉我应该如何清理我的用户输入,以便他们可以发布一些图像(<img>
标签)并大胆使用等等?
答案 0 :(得分:5)
似乎很多人都找到了消毒剂rather useless。不要使用消毒剂,只需编码所有内容,然后解码安全部件:
private static readonly Tuple<string, string>[] WhiteList = (new string[]
{
"<b>", "</b>", "<i>", "</i>"
})
.Select(tag => Tuple.Create(AntiXss.Encoder.HtmlEncode(tag), tag))
.ToArray();
public static string Sanitize(string html)
{
var safeHtml = new StringBuilder(AntiXss.Encoder.HtmlEncode(html));
for (int index = 0; index < WhiteList.Length; index++)
{
string encodedTag = WhiteList[index].Item1;
string decodedTag = WhiteList[index].Item2;
safeHtml.Replace(encodedTag,decodedTag);
}
return safeHtml.ToString();
}
请注意,安全解码 IMG 标记几乎是不可能的,因为攻击者可以通过简单的方法滥用此标记。例子:
<IMG SRC="javascript:alert('XSS');">
<IMG SRC=javascript:alert('XSS')>
请点击此处查看更详细的XSS Cheat Sheet
答案 1 :(得分:1)
This post最好地描述了Anti XSS库的问题,并提供了一套很好的解决方案,即将一组标记和属性列入白名单。
我在我的项目中使用此解决方案,似乎效果很好。
答案 2 :(得分:0)
有一种非常简单的方法可以通过摆脱“危险”标签来阻止威胁。
string SanitizeHtml(string html)
{
html = System.Web.HttpUtility.HtmlDecode(html);
List<string> blackListedTags = new List<string>()
{
"body", "script", "iframe", "form", "object", "embed", "link", "head", "meta"
};
foreach (string tag in blackListedTags) {
html = Regex.Replace(html, "<" + tag, "<p", RegexOptions.IgnoreCase);
html = Regex.Replace(html, "</" + tag, "</p", RegexOptions.IgnoreCase);
}
return html;
}
有了这个,用户仍然可以看到危险脚本中的内容,但不会损害任何内容。