使用ASP.NET MVC防止JS注入

时间:2011-02-16 11:46:15

标签: javascript asp.net-mvc validationattribute

我想允许用户将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;
    }
}

这是否足够? 你怎么做才能检查这种顽皮?

3 个答案:

答案 0 :(得分:3)

看看Microsoft AntiXSS library。它拥有一个AntiXSS.GetSafeHtmlFragment()方法,它返回剥离了所有XSS-badness的HTML。

正如大卫指出的那样,白名单总是可行的。 AntiXSS使用HTML元素/属性的白名单,可以安全地防止XSS /过滤掉JavaScript。

答案 1 :(得分:2)

  

这是否足够?

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

没有。这是一个正则表达式。正则表达式在处理任意HTML时都是垃圾。

  

你做了什么来检查这种顽皮?

正确的HTML解析器与白名单结合使用。

答案 2 :(得分:0)

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

最终的重构版本应该非常可靠。安全性从来不是100%类型的东西,但这可能比其他大多数示例更好。