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

这是足够的吗? 你做了什么来检查这种顽皮?

有帮助吗?

解决方案

看看 Microsoft Antixs Library 。它拥有一个生成的世代odeTagcode方法,它返回所有XSS-Badness的HTML。

正如大卫指出的那样,一个白色的列表总是可以走出来的方式。antixs使用HTML元素/属性的白名单,该属性是安全的XSS /筛选器的javascript。

其他提示

这是足够的吗?

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

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

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

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

jeff atwood在重构我的代码上讨论了这个主题。肯定值得查看它的时间: http://refactormycode.com/codes/333-sanitize-html

最终的重构版本应该非常坚固。安全永远不会是100%的东西,但这可能比漂浮在周围的大多数其他例子更好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top