JavaScript DOM XSS注入验证

JavaScript DOM XSS注入验证,javascript,regex,dom,utf-8,xss,Javascript,Regex,Dom,Utf 8,Xss,当将HTML嵌入DOM时,此正则表达式是否足以捕获所有跨站点脚本尝试。例如:用document.write() (javascript:|) 本文件从modsecurity.com中引用了它 例如,它会捕获UTF-8中的所有变体吗 不幸的是没有。如果攻击者真的在尝试的话,实际上有很多方法可以偷偷绕过正则表达式。在现代浏览器中,正则表达式应该做得很好,但它并不详尽。例如,类似的东西可以打开javascript而不显式地说script或javascript <img src="blah.j

当将HTML嵌入DOM时,此正则表达式是否足以捕获所有跨站点脚本尝试。例如:用document.write()

(javascript:|)
本文件从modsecurity.com中引用了它


例如,它会捕获UTF-8中的所有变体吗

不幸的是没有。如果攻击者真的在尝试的话,实际上有很多方法可以偷偷绕过正则表达式。在现代浏览器中,正则表达式应该做得很好,但它并不详尽。例如,类似的东西可以打开javascript而不显式地说script或javascript

<img src="blah.jpg" alt="" onmousedown="alert('a')" />


检查一下(有些过时,但能理解要点),更多的例子不幸的是没有。如果攻击者真的在尝试的话,实际上有很多方法可以偷偷绕过正则表达式。在现代浏览器中,正则表达式应该做得很好,但它并不详尽。例如,类似的东西可以打开javascript而不显式地说script或javascript

<img src="blah.jpg" alt="" onmousedown="alert('a')" />

查看(有点过时,但理解了要点)和更多示例

这个正则表达式是否足以捕获所有跨站点脚本尝试

哈哈哈哈哈

对不起。但是真的。。。不,这还不是冰山一角

Daniel提到了另一种注入脚本的方法,但实际上有数百种。使用简单的正则表达式来清理HTML是完全不可能的。唯一的方法(即使这样也不是很简单)是正确地解析HTML,抛出所有格式错误的序列和元素/属性名称,除了一些已知的安全名称

当然,这只适用于您实际上有意接受HTML输入并且希望限制其潜在危害的情况。如果情况是您正在接受文本,但在退出时忘记正确转义,则需要修复HTML转义,因为再多的输入嗅探也无法修复输出问题

这就是为什么“mod_安全性”完全是假的。它通过捕捉一些最基本的注入技术,让您产生一种提高安全性的错觉,同时让其他一切都通过易受攻击的应用程序。最终,它不会阻止你被黑客攻击,但你添加的注入签名越多,它就越会拒绝和破坏合法请求。例如,它可能会阻止我输入此消息,因为它包含字符串

这个正则表达式是否足以捕获所有跨站点脚本尝试

哈哈哈哈哈

对不起。但是真的。。。不,这还不是冰山一角

Daniel提到了另一种注入脚本的方法,但实际上有数百种。使用简单的正则表达式来清理HTML是完全不可能的。唯一的方法(即使这样也不是很简单)是正确地解析HTML,抛出所有格式错误的序列和元素/属性名称,除了一些已知的安全名称

当然,这只适用于您实际上有意接受HTML输入并且希望限制其潜在危害的情况。如果情况是您正在接受文本,但在退出时忘记正确转义,则需要修复HTML转义,因为再多的输入嗅探也无法修复输出问题


这就是为什么“mod_安全性”完全是假的。它通过捕捉一些最基本的注入技术,让您产生一种提高安全性的错觉,同时让其他一切都通过易受攻击的应用程序。最终,它不会阻止你被黑客攻击,但你添加的注入签名越多,它就越会拒绝和破坏合法请求。例如,它可能会阻止我输入此消息,因为它包含字符串

。其他受访者是对的:有许多上下文可能会发生注入。请记住,解决方案必须考虑注入可能发生的许多上下文。黑名单(或“已知的坏”)过滤方法将不起作用,因为它们成为攻击的牺牲品,这些攻击使用意外的字符集、创造性地使用空格和其他技术对注入进行编码。有关详细信息,请参阅。该页面的链接提供了“问题”方面的信息

关于这个解决方案,考虑一下我们刚刚发表的。备忘单中引用了几个工具包,可帮助您实施转义或编码策略。我最喜欢的确保服务器编写的客户端代码正确编码和转义的方法可能是。从谷歌代码页面:

<!-- Automatically escaped content -->
Hello ${user.getName()}!

<!-- Example tag with 3 different contextual encoding requirements -->
<img src="/profile-photo?user=${user.getId()}"
     alt="Photo of ${user.getName()}"
     onclick="openProfile('${user.getId()}')" />

<!-- Override the default escape, rare, but occasionally needed: -->
<jxt:out value="${user.getProfileHtml()}" escape="none"/>

你好${user.getName()}!

请注意,这包括上下文的自动转义,但也包括允许未转义输出的自定义标记,以防页面/应用程序的特殊元素被cart blanch编码机制破坏。

其他回答者是对的:有许多上下文可能发生注入。请记住,解决方案必须考虑注入可能发生的许多上下文。黑名单(或“已知的坏”)过滤方法将不起作用,因为它们成为攻击的牺牲品,这些攻击使用意外的字符集、创造性地使用空格和其他技术对注入进行编码。有关详细信息,请参阅。该页面的链接提供了“问题”方面的信息

关于这个解决方案,考虑一下我们刚刚发表的。备忘单中引用了几个工具包,可帮助您实施转义或编码策略。我最喜欢的确保服务器编写的客户端代码正确编码和转义的方法可能是。从谷歌代码页面:

<!-- Automatically escaped content -->
Hello ${user.getName()}!

<!-- Example tag with 3 different contextual encoding requirements -->
<img src="/profile-photo?user=${user.getId()}"
     alt="Photo of ${user.getName()}"
     onclick="openProfile('${user.getId()}')" />

<!-- Override the default escape, rare, but occasionally needed: -->
<jxt:out value="${user.getProfileHtml()}" escape="none"/>

你好${user.getName()}!
请注意,这包括上下文的自动转义,但也包括允许未转义输出的自定义标记,以防页面/应用程序的特殊元素被cart blanch破坏