如何正确消毒与AntiXss库的内容?(How to properly sanitize conte

2019-09-22 20:49发布

我有一个简单的论坛应用程序,当有人张贴任何内容,我做的:

post.Content = Sanitizer.GetSafeHtml(post.Content);

现在,我不知道如果我做错了什么,或者是怎么回事,但它不允许几乎没有HTML。 甚至简单<b></b>是太多了。 所以我想这工具是完全无用的。

现在我的问题:谁能告诉我,我应该如何清理我的用户输入,从而使他们可以张贴一些图像( <img>标签),并使用粗体强调等?

Answer 1:

似乎很多人觉得消毒剂,而没用 。 除了使用消毒剂,只是一切都进行编码,安全和解码部分回:

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=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;>

看看这里更彻底的XSS小抄



Answer 2:

这篇文章最好的描述与反XSS库中的问题,并提供良好的工作围绕着白名单一组标签和属性。

我用在我的项目该解决方案,似乎工作的伟大。



Answer 3:

有一个很简单的方法来阻止由刚刚摆脱“危险”标签的威胁。

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;
}

有了这个用户仍然会看到什么是危险的脚本中,但它不会伤害任何东西。



文章来源: How to properly sanitize content with AntiXss Library?