我的应用程序存在跨站点脚本(XSS)漏洞问题。 我有多种形式,用户可以提交数据,这些数据将存储在数据库中,稍后会在jsp页面中显示。 我发现此应用程序没有得到足够的保护,用户可以提交恶意代码,从而引发XSS攻击。
我需要在提交表单后验证服务器端的用户输入。 因为在客户端,数据是使用表库显示的,表库将呈现html内容(我无法控制此库)。 我在这个链接(https://appsec-labs.com/portal/xss-java-secure-coding/)中找到了一个很好的库,但它只涉及客户端。
如何验证这些输入数据?无论是html还是javscript代码还是其他什么。
由于
答案 0 :(得分:1)
基本上,您需要将<
等HTML特殊字符替换为<
等HTML实体。
在JSP中,您可以使用JSTL标记或fn:escapeXml()来防止这种情况。还有另一个答案covers that here。在PHP中,您可以尝试使用htmlspecialchars
函数。
另外请注意SQL injection和CSRF attacks。 OWASP Top Ten概述了一些常见的漏洞。
答案 1 :(得分:1)
解决这个问题的正确方法是修复这个库(你无法控制)或用更好的东西替换它。缺陷在库中,而不在您的代码中。存在XSS漏洞的原因是渲染代码将数据插入不安全的位置和/或无法正确地逃避其输出。
这就是说,可以在不修复/替换库的情况下保护您的应用程序。或者它可能不会。它在很大程度上取决于库插入用户提供的数据的位置。
如果您可以将输入限制为一串字母数字字符或更好的白名单授权值,那么您很可能是安全的。这意味着没有空格,没有简单的引号或双引号,没有低于或高于标志,没有逗号,没有冒号,没有分号......如果你不能,你就无法控制渲染代码似乎是这样,那么所有的赌注都会被取消。
通过阅读本文,您可以更好地理解这个问题: https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet
答案 2 :(得分:0)
我会推荐OWASP java编码器(或ESAPI)项目。 https://www.owasp.org/index.php/OWASP_Java_Encoder_Project(以及GitHub:https://github.com/OWASP/owasp-java-encoder/)。可悲的是,有点稀疏。
XSS的问题在于它依赖于上下文。您需要根据显示用户输出的位置进行不同的编码(例如,您在javascript标记之间或uri或html标记之间放置的数据的编码不同)。 OWASP Java Encoder设置了可以编码/解码的不同上下文。如果数据只是通过jsp标签输出,那么我会使用
Encode.forHtml("input here");
您还可以对javascript进行编码:
Encode.forJavaScript("input here");
您可以在owasp网站上下载,也可以通过maven下载(请查看github链接)。
这个库还允许你通过JSP页面中的JSP标签进行编码,但是你必须挖掘一下才能找到doco。我总是用Java做的。
此stackoverflow问题涵盖了有关如何正确配置库的链接:Configure ESAPI Security Encoding Library to prevent XSS Cross-site scripting issue