0

我希望允许用户将 HTML 发布到站点,但需要确保没有将 Javascript 注入站点。

到目前为止,我已经创建了一个验证属性来检查传入的 html 是否存在狡猾的行为

[AttributeUsage(AttributeTargets.Property, 
    AllowMultiple = false, Inherited = true)]
public class CheckHtml : ValidationAttribute, IMetadataAware {

    private static Regex _check = new Regex(
        @"<script[^>]*>.*?<\/script>|<[^>]*(click|mousedown|mouseup|mousemove|keypress|keydown|keyup)[^>]*>",
        RegexOptions.Singleline|RegexOptions.IgnoreCase|RegexOptions.Compiled);

    protected override ValidationResult IsValid(
        object value, ValidationContext validationContext) {

        if(value!=null
            && _check.IsMatch(value.ToString())){

            return new ValidationResult("Content is not acceptable");
        }

        return ValidationResult.Success;
    }

    /// <summary>
    /// <para>Allow Html</para>
    /// </summary>
    public void OnMetadataCreated(ModelMetadata metadata) {
        if (metadata == null) {
            throw new ArgumentNullException("metadata");
        }
        metadata.RequestValidationEnabled = false;
    }
}

这足够了吗?你怎么做才能检查这种调皮?

4

3 回答 3

3

查看Microsoft AntiXSS 库。它拥有一个AntiXSS.GetSafeHtmlFragment()方法,该方法返回去除所有 XSS 缺陷的 HTML。

正如大卫所指出的,白名单始终是要走的路。AntiXSS 使用对 XSS 安全/过滤掉 JavaScript 的 HTML 元素/属性的白名单。

于 2011-02-16T12:30:17.097 回答
2

这足够了吗?

不,这是一个黑名单。黑名单永远不够。

不,这是一个正则表达式。正则表达式在处理任意 HTML 时是垃圾。

你怎么做才能检查这种调皮?

适当的 HTML 解析器与白名单相结合。

于 2011-02-16T12:02:58.117 回答
0

Jeff Atwood 在重构我的代码时对这个话题进行了很好的讨论。绝对值得花时间去看看:http ://refactormycode.com/codes/333-sanitize-html

最终的重构版本应该非常可靠。安全性从来都不是 100% 的事情,但这可能比大多数其他漂浮的例子要好。

于 2011-02-16T11:58:05.977 回答