spring 如何在Sping Boot 应用程序中防止跨站脚本(XSS)攻击?

8yparm6h  于 5个月前  发布在  Spring
关注(0)|答案(2)|浏览(60)

我想用XSS保护我的Sping Boot 应用程序。我用Spring Security实现了Sping Boot Boot应用程序。
此外,我有第二个应用程序(前端)工作在不同的端口(不同的起源)-这就是为什么我不能设置内容安全策略为'自我',以防止XSS攻击。

如何实现基本的XSS防护,过滤掉所有传入请求中的可疑字符串?
编辑:

我找到了这篇文章:但是这个项目使用的ESAPI库是相当大的,减慢了应用程序,所以我想找到不同的,更容易的方法。

pxiryf3j

pxiryf3j1#

通用过滤器可能不可靠。通常最好对输入进行验证,并对输出单独进行编码,因为什么是有效的,需要什么编码取决于值及其上下文。
要做的主要事情是在必要的地方应用正确的编码,并小心使用值的地方。请参阅OWASP XSS Prevention页面。
Baeldung的文章使用ESAPI.encoder().canonicalize(value)来解码以&%\开头的各种序列。
如果这些字符在任何输入中都是有效字符,那么解码会破坏输入,不应该这样做。
如果它们无效,那么应该拒绝输入。如果输入确实是恶意的,那么无论如何都不应该处理它。所以对ESAPI的调用可能是:

if(value.matches(".*[\\\\%&].*")) {
    throw new RuntimeException("Invalid character");
}

字符串

mm5n2pyu

mm5n2pyu2#

优先清理输出而不是输入,以防止XSS攻击。

输入清理问题:

编码器可能会非常激进,并改变原始输入。因此,如果您的电子邮件ID包含@,它可能会转换为@,从而改变输入的整个含义并破坏功能。

输入验证:

输入验证对于数据完整性非常重要。例如,在将其保存到数据库之前检查它是否是有效的电子邮件。这种验证本质上可以防止攻击者将脚本数据保存在数据库中 (xss攻击的上半部分)。但是,有些输入字段本质上是非常开放的,例如:评论框或html编辑器。这些输入无法验证。

输出清理:

在数据库中有html脚本并不是xss攻击的主要原因,但在html中渲染时执行它们会导致问题。因此,在XSS的上下文中,始终使用编码器(如ESAPI.encodeForHTML())对输出进行编码,输入验证是可选的,并且有很多原因。

XSS和SPA(Angular/React)

如果你的UI是一个使用Angular,React等技术的单页应用程序。那么你可能不需要从BE编码你的输出。因为,这些技术将确保将脚本(如果有的话)呈现为纯文本,而不是执行它们。

相关问题