用ASP.NET MVC固定JS注入
-
14-11-2019 - |
题
我想允许用户将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%的东西,但这可能比漂浮在周围的大多数其他例子更好。
不隶属于 StackOverflow