使用 Snyk 防止 Java 应用程序中的跨站点脚本 (XSS)

Java 是一种强大的后端编程语言,也可用于为 Web 应用程序编写 HTML 页面。但是,开发人员在创建这些页面时必须了解与跨站点脚本 (XSS) 攻击相关的潜在安全风险。随着现代模板框架的兴起,通过适当的输入验证和编码技术防止安全攻击变得更加容易。然而,当开发人员选择在不使用模板框架的情况下创建自己的 HTML 页面时,引入漏洞的风险就会增加。 

例如,使用HttpServletResponseSpring MVC 应用程序中的对象将内容直接写入响应可能会为恶意用户将代码注入页面创造机会,从而导致潜在的 XSS 攻击。因此,开发人员必须采取措施,在编写 HTML 页面时采取适当的措施来防止 XSS 漏洞,从而确保其 Java Web 应用程序的安全性保持较高水平。

像下面这样的解决方案是实现服务器端呈现页面的一种简单方法,无需任何通常带有特定指令的花哨框架。但是,这种方法显然有一些缺点。

在没有模板框架的情况下在 Spring MVC 中编写 HTML 输出

假设您有一个 Web 应用程序,它获取产品名称并使用该对象将其显示在网页上HttpServletResponse。以下是您如何在 Spring MVC 控制器中实现此功能的示例:

``` @GetMapping("/direct") public void directLink (@RequestParam String param, HttpServletResponse response) throws IOException { Product prod = productService.getProductByName(param);

response.setContentType("text/html"); var writer = response.getWriter(); writer.write(head); writer.write("

"+ param + "

");

String output = "

" + "
  • " + "
  • %s
  • " + "
  • %s
  • " + "
  • %s
  • " + "
" + "
";

writer.write(String.format(output, prod.getDescription(), prod.getProductType(), prod.getPrice())); writer.write(foot);

response.getWriter().flush(); } ```

你能弄清楚上面的 Java 代码可能引入了什么样的安全漏洞吗?

使用 Snyk 代码查找 XSS

当仔细查看上面的函数时,您可能已经识别出至少一个 XSS 漏洞,甚至两个。当使用Snyk Code扫描我的应用程序时,我们会收到此方法中两个不同的 XSS 问题的通知。

有多种方法可以利用 Snyk 代码。让我们来看看三个不同的例子。从 Snyk Code 获得反馈给开发人员的最直接方式是在 IDE 中安装插件。我们有许多可用的不同 IDE 的插件。在下面的示例中,我展示了 IntelliJ 插件如何帮助我在开发过程中发现 XSS 问题。

Intellij 插件输出:

博客预防 xss 产品控制器

另一种选择是使用 Snyk CLI 运行 Snyk 代码。从终端运行命令snyk code test将为您提供如下输出。此方法在您的本地计算机上或作为 CI/CD 管道中自动构建的一部分很有用。

CLI 输出:

博客预防 xss 高漏洞

我想向您展示的第三个选项是 Web UI。对于此输出,我使用了与 Snyk 的 git 集成,并使用位于https://app.snyk.io的仪表板将我的 GitHub 存储库连接到 Snyk Web UI 。此解决方案扫描提交到我的存储库的代码以查找安全漏洞。 

网页界面输出:

博客预防 xss-snyk-代码报告

所有三种不同的扫描选项都向我表明,我需要解决两个不同的 XSS 安全问题——使用 Snyk Code 精确定位它们在我的代码中的确切位置。让我们分解它们,看看我们如何减轻它们。

反射型 XSS 

反射型 XSS 是一种 XSS 攻击,当用户将恶意代码注入到 Web 应用程序中,然后作为响应的一部分反射回用户时,就会发生这种攻击。在我提供的示例中,如果用户输入在写入响应之前未经过正确验证或清理,则恶意用户可能会注入一个脚本,该脚本将由查看该网页的其他用户执行。这种类型的 XSS 攻击通常用于窃取用户数据、修改网站内容或执行其他恶意操作。

上面的代码从 HTTP 请求参数中检索用户名,然后使用以下方法将其直接写入 HttpServletResponse 对象:

writer.write("<div class="panel-heading"><h1>"+ param + "</h1></div>")

此代码容易受到 XSS 攻击,因为它没有正确验证或清理用户输入。例如,恶意用户可以将 HTML 或 JavaScript 代码注入“name”参数,然后其他查看该网页的用户将执行这些代码。

例如:.../direct?param=<script>alert(document.cookie);</script>可能会泄露您的个人 cookie 信息。这意味着我们也可以在您不知情的情况下将此信息发送到另一台服务器。

Snyk Code 通过在第 93 行指出 XSS 为我发现了这个错误。

存储型 XSS

另一方面,存储型 XSS 是一种 XSS 攻击,其中恶意代码存储在服务器上,然后提供给访问受影响页面的所有用户。在我提供的示例中,如果用户输入未得到正确验证或清理,而是存储在数据库中,则恶意用户可能会注入一个脚本,该脚本将提供给所有查看受影响页面的用户。这种类型的 XSS 攻击可能特别危险,因为它会影响大量用户,并且即使在修复初始注入后也可能持续存在。

上面的代码从中检索产品ProductService,然后将它们作为输出字符串的一部分显示在字段中。但是,此代码容易受到存储型 XSS 攻击,因为它没有正确验证或清理来自数据库的输入。如果您不确定谁有权写入数据库,则清理尤为重要。例如,恶意用户可以提交包含 HTML 或 JavaScript 代码的产品说明,这些代码将存储在数据库中并提供给访问产品视图的所有用户。 

Snyk 代码在第 103 行指出了这个潜在的 XSS 问题,我们在product.description没有验证或清理的情况下将其插入到输出字符串中。

使用 Snyk 代码缓解 XSS 漏洞

为防止 XSS 漏洞,在将用户输入写入响应之前正确验证和清理用户输入非常重要。Snyk Code 已经通过指出可能的解决方案来帮助我们。一种方法是使用像Apache Commons Text这样的库来对输入进行编码并防止执行恶意代码。

博客防止 xss 字符串路径

使用该escapeHtml4()函数,我们可以确保反射型 XSS 和存储型 XSS 中的代码都被转义,以便在加载页面时不会执行。

显然,更多的库可以执行类似的转义。除了Apache Commons Text,您还可以查看OWASP 编码器。如果您使用Spring,您还可以使用 Spring 的HtmlUtils.htmlEscape

使用 Apache Commons 文本时,正确转义的代码可能如下所示:

``` @GetMapping("/direct") public void directLink (@RequestParam String param, HttpServletResponse response) throws IOException { Product prod = productService.getProductByName(param);

response.setContentType("text/html"); var writer = response.getWriter(); writer.write(head); writer.write("

"+ StringEscapeUtils.escapeHtml4(param) + "

");

String output = "

" + "
  • " + "
  • %s
  • " + "
  • %s
  • " + "
  • %s
  • " + "
" + "
";

writer.write(String.format(output, StringEscapeUtils.escapeHtml4(prod.getDescription()), StringEscapeUtils.escapeHtml4(prod.getProductType()), StringEscapeUtils.escapeHtml4(prod.getPrice())));

writer.write(foot); ```

小心使用模板框架

像 Thymeleaf 这样的模板框架可以帮助防止 XSS 漏洞。Thymeleaf 是一种流行的 Java 模板引擎,它包括对 HTML 转义的内置支持,这有助于通过对包含在呈现的 HTML 中的任何用户输入进行编码来防止 XSS 攻击。

但是,这在很大程度上取决于您创建模板的方式。例如,下面是您可以如何使用 Thymeleaf 来呈现类似于之前示例的产品:

```

```

在此示例中,th:text属性将被转义,但th:utext属性不会。此th:utext属性在不转义任何 HTML 标记或特殊字符的情况下呈现评论文本,并且可能容易受到 XSS 攻击。使用特定框架时,​​了解某些元素的行为方式至关重要。

在部署到生产环境之前捕获 XSS

防止 XSS 攻击是开发 Java Web 应用程序的开发人员最关心的问题。在开发过程中尽早识别和解决 XSS 漏洞至关重要。尽管清理用户输入可以有效缓解 XSS 攻击,但这并不总是足够的。

此外,重要的是利用正确的工具在 XSS 错误和其他安全问题投入生产之前将其捕获。Snyk Code 是一个有价值的免费工具,用于在开发周期的早期识别潜在的安全漏洞。通过采取主动的 XSS 预防方法并使用正确的资源和工具,开发人员可以帮助确保其 Java Web 应用程序的安全性和完整性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

youtian.L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值