我想允许用户将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;
}
}
这是否足够? 你怎么做才能检查这种顽皮?
答案 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%类型的东西,但这可能比其他大多数示例更好。