我有一个简单的论坛应用程序,当有人张贴任何内容,我做的:
post.Content = Sanitizer.GetSafeHtml(post.Content);
现在,我不知道如果我做错了什么,或者是怎么回事,但它不允许几乎没有HTML。 甚至简单<b></b>
是太多了。 所以我想这工具是完全无用的。
现在我的问题:谁能告诉我,我应该如何清理我的用户输入,从而使他们可以张贴一些图像( <img>
标签),并使用粗体强调等?
我有一个简单的论坛应用程序,当有人张贴任何内容,我做的:
post.Content = Sanitizer.GetSafeHtml(post.Content);
现在,我不知道如果我做错了什么,或者是怎么回事,但它不允许几乎没有HTML。 甚至简单<b></b>
是太多了。 所以我想这工具是完全无用的。
现在我的问题:谁能告诉我,我应该如何清理我的用户输入,从而使他们可以张贴一些图像( <img>
标签),并使用粗体强调等?
似乎很多人觉得消毒剂,而没用 。 除了使用消毒剂,只是一切都进行编码,安全和解码部分回:
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小抄
这篇文章最好的描述与反XSS库中的问题,并提供良好的工作围绕着白名单一组标签和属性。
我用在我的项目该解决方案,似乎工作的伟大。
有一个很简单的方法来阻止由刚刚摆脱“危险”标签的威胁。
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;
}
有了这个用户仍然会看到什么是危险的脚本中,但它不会伤害任何东西。