如何使用 Spring Boot 验证和清理 HTTP Get?

2024-03-24

我不断从 Checkmarx 代码扫描仪收到这个恼人的错误,

Method getTotalValue at line 220 of src\java\com\example\PeopleController.java 
gets user input for the personName element. This element’s value then flows through
the code without being properly sanitized or validated and is eventually 
displayed to the user. This may enable a Cross-Site-Scripting attack. 

这是我的代码。我想我已经完成了所有必要的验证。还有什么???

@Slf4j
@Configuration
@RestController
@Validated 

public class PeopleController {

    @Autowired
    private PeopleRepository peopleRepository; 

    @RequestMapping(value = "/api/getTotalValue/{personName}", method = RequestMethod.GET)
    @ResponseBody
    public Integer getTotalValue(@Size(max = 20, min = 1, message = "person is not found") 
    @PathVariable(value="personName", required=true) String personName) {

        PersonObject po = peopleRepository.findByPersonName(
                            Jsoup.clean(personName, Whitelist.basic()));

        try {
            return po.getTotalValue(); 
            } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }  


@ExceptionHandler
    public String constraintViolationHandler(ConstraintViolationException ex) {
        return ex.getConstraintViolations().iterator().next()
                .getMessage();
    } 

} 

肯定有一些缺失的验证。如何使用 Spring Boot 正确验证 HTTP GET


您需要小心使用这些扫描工具,因为有时这些工具确实会报告误报,有时不需要更改代码。我不是 checkmarx 专家,但请确保该工具真正理解您正在使用的 Bean 验证注释和调用Jsoup.clean(personName, Whitelist.basic()) .

我想我已经完成了所有必要的验证。还有什么???

首先您需要了解应用程序级别之间的差异输入卫生& 业务层面输入验证对于控制器。您在这里所做的是第二部分,第一部分可能在您的设置中丢失,这是专门从安全角度完成的并且通常是为整个应用程序设置的。

您正在使用@Size注释来限制输入的大小,但这并不能保证坏字符串 - 可能导致 XSS 攻击的字符串。然后,您正在使用呼叫Jsoup.clean(personName, Whitelist.basic()))清理这个大小经过验证的输入。由于我不确定该调用的作用,因此您需要确保新值是 XSS - 安全的。您立即将该值传递给数据库调用,然后返回Integer对于调用者/客户端,所以我对这里发生 XSS 攻击的可能性非常悲观,但工具是这么说的。

肯定有一些缺失的验证。如何验证 HTTP GET 正确使用 Spring Boot

正如我之前所解释的,输入验证是一个通常用于业务逻辑级别输入验证的术语,而输入清理/清理则与安全性有关。在Spring Boot环境中,这通常是通过使用来完成的Spring 安全 API& 启用 XSS 过滤器或编写您自己的 XSS 过滤器并将其插入您的应用程序中。过滤器先出现,控制器随后出现,因此您的控制器将始终具有经过净化的值,并且您将对该经过净化的值应用业务验证。

这是一个广泛的答案,对于代码等,您可能会进行谷歌搜索。还建议阅读更多有关 XSS 攻击的内容。只要明白有多种方法可以实现同一目标。

预防 XSS 的 3 种方法 https://www.checkmarx.com/2017/10/09/3-ways-prevent-xss/

Java 中的 XSS 预防 https://searchsoftwarequality.techtarget.com/answer/XSS-prevention-in-Java

如何在 Spring RESTful 中创建过滤器来防止 XSS? https://stackoverflow.com/questions/31282379/how-to-use-spring-security-to-prevent-xss-and-xframe-attack

跨站脚本 (XSS) 攻击教程,包含示例、类型和预防 https://www.softwaretestinghelp.com/cross-site-scripting-xss-attack-test/

在最后一个链接中,提到了,

预防这种攻击的第一步是输入验证。 用户输入的所有内容都应该经过精确验证, 因为用户的输入可能会找到输出。

并且您没有在代码中执行此操作,因此我猜测不存在 XSS。

EDIT:

XSS 安全有两个方面 - 首先不允许对服务器端代码进行恶意输入&这可以通过 XSS 过滤器来完成&有时,允许恶意输入没有任何害处(假设您正在将恶意输入保存到数据库或在 API 响应中返回)。

第二个方面是指导 HTML 客户端有关可能的 XSS 攻击(如果我们确定 API 客户端将是 HTML / UI),那么我们需要添加X-XSS-Protectionheader & 这将通过下面的代码完成。这将使浏览器能够打开其 XSS 保护功能(如果有)。

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.headers().xssProtection()....
}

什么是 http 标头“X-XSS-Protection”? https://stackoverflow.com/questions/9090577/what-is-the-http-header-x-xss-protection

Spring security中的Xss防护默认开启吗? https://stackoverflow.com/questions/37606227/is-xss-protection-in-spring-security-enabled-by-default

对于第一个方面,即编写过滤器 - 请参阅我的这个答案 https://stackoverflow.com/a/49399129/3850730以及该答案中的链接。

我想,我上面错误地写了 Spring Security 提供了输入卫生过滤器,我想,它没有。将核实并通知您。我已经在回答这个问题时提到的行上编写了我的自定义过滤器 -防止 Spring MVC 控制器中的 XSS https://stackoverflow.com/questions/41938010/prevent-xss-in-spring-mvc-controller

您还必须了解 Spring Boot 也用于编写传统的 MVC 应用程序,其中服务器端也呈现要渲染的 HTML。在 JSON 响应(REST API)的情况下,UI 客户端可以控制要转义的内容和不转义的内容,因此会出现复杂性,因为 JSON 输出并不总是提供给 HTML 客户端(即浏览器)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Spring Boot 验证和清理 HTTP Get? 的相关文章

随机推荐

  • 如何将换行符放入 R 中 xtable 的列标题中

    我有一个数据框 我正在将其放入sweave http www stat uni muenchen de leisch Sweave 使用 xtable 的文档 但是我的列名之一很长 我想将其分成两行以节省空间 calqc table lt
  • Weblogic:调用不带架构名称的 DB2 存储过程(属性 currentSchema)

    我有一个在 Weblogic 上运行的 Java 应用程序 应用程序需要访问 DB2 数据库中的存储过程 因此 JDBC 数据源是通过其 JNDI 名称来配置和访问的 数据源 ClassDriver com ibm db2 jcc DB2D
  • XSLT 生成 UUID

    如何使用纯 XSLT 生成 UUID 基本上是寻找一种使用 XSLT 创建独特序列的方法 该序列可以是任意长度 我正在使用 XSLT 2 0 这是一个好例子 http www pure xml com cblog index php arc
  • 如何使用 EPPlus 在 C# 中逐行读取 Excel 文件

    在我的 MVC 控制器中 我试图逐行读取 Excel 但是有一个问题 我希望能够将其映射到列表 模型类包含29个字段 public class GroupMembershipUploadInput public string chpt cd
  • 在 Visual Studio 中发布程序

    我是 Visual Studio 的新手 我正在尝试弄清楚如何 发布 我的程序 以便我可以将其移动到其他计算机并从那里运行它 我不确定这是否有什么不同 但我的解决方案中有三个项目 如果我发布它 我是否仍然能够继续开发原始文件等 多谢 好的
  • 画一条平滑的线

    我正在使用 libgdx 开发游戏 我想使用形状渲染器绘制一条平滑的线条 shaperenderer begin ShapeType Line shaperenderer line fisrstVec2 secondVec2 shapere
  • 如何通过Selenium和WebDriverWait等待元素包含特定属性?

    我有一个关于硒的问题是否有人可以帮忙 我需要进入一个 URL 页面 该页面上的节点最初处于 已注册 状态 X 秒后 其状态将动态更改为 就绪 状态 在其状态转变为 就绪 状态之前 我可能会在 selenium 执行期间继续执行后续步骤 这是
  • 使用 picasso 从 api 加载 recyclerview 中的图像

    使用 picasso 从 api 在 RecyclerView 中添加图像 使用Picasso加载图像非常简单 你可以这样做Picasso get load http i imgur com DvpvklR png into imageVi
  • 根据标签绘制分配颜色

    我确信有一个非常简单的方法可以做到这一点 但我一生都无法弄清楚 我正在 Plot ly 中绘制散点图 我绘制的每个点都被分配了一个标签 例如通过 高 低 西格玛高等 我的问题是我似乎无法修复plot ly 分配给每个标签的颜色 我希望 Pa
  • 将 Mechanize 设置为接受 cookie

    我正在尝试使用 mechanize 从网站检索一些数据以自动搜索公寓 无垃圾邮件 但是 当我向该站点发送请求时 响应具有以下标头 header Cache Control no store no cache max age 0 must r
  • IIS 7.5/Windows Server 2008 上的 PHP 错误日志

    我很困惑应该在运行 IIS 7 5 的 Windows 2008 Server 上寻找包含 php 错误的日志文件 我更熟悉 Mac OS X 的设置 在我的 php ini 文件中 我将 log errors 设置为 On 但我没有在该文
  • 在 CLion 中使用 WSL 工具链时如何启用 Rust 调试?

    我是 Rust 新手 现在在 Windows 上使用 CLion 和 JetBrains 的 Rust 插件 当我刚刚编译并运行时它运行良好 但是当我开始调试时 即使我将工具链切换到 WSL 它也会显示这样的对话框 我想知道 WSL 是否是
  • 在 React 中创建的选择控件不会在浏览器刷新时重置(IE11 和 Edge)

    我有一个非常简单的 React 应用程序 只有一个选择控件 查看工作应用程序here http www webpackbin com 4JyNOWVpW 选择控件有 3 个值 星期日 星期一和星期二 星期日是默认值 不幸的是 在 IE11
  • Java - ImageIO.write 的加载文件在 .jar 中不起作用

    我正在用 Java 制作一个游戏 我想将随机生成的地图保存在图像上 然后加载它 我的代码在 Eclipse 中工作没有问题 但是当我将其导出到 jar exe 文件时 创建文件 mapf 时出现问题 谢谢您的回答 private void
  • 我可以将动画应用到边距吗?

    我正在尝试在 CSS3 边距中制作动画 这这个网站 http css3 bradshawenterprises com transitions 似乎说你可以 但我无法工作 我实际上有3个动画 1 为简单的首字母fadeIn在初始负载上 然后
  • 使用AWS SQS作为Aurora数据库的写入队列来提高系统性能是否有效

    我正在 AWS 上开发一个 Web 应用程序服务器 需要支持高吞吐量的读写 我的老板给了我这样的高级设计 我被困在 写入队列 上 团队告诉我 我们需要它来提高写入性能 因为我们只能有 1 个可以写入的主副本 我对 SQS 和 RabbitM
  • 包构建忽略 Makevars 标志

    Question 我试图告诉我的包使用gcc来编译C 代码代替clang 为什么不是我的CXX我的旗帜Makevars文件正在使用 我期待 希望解决方案非常简单 但我却忽略了 这是我的理解 参见参考 我可以指定CXX 任一标志 src Ma
  • 如何提取从 AWS EventBridge 中继到 ECS Fargate 的事件

    我将问题表述如下 EventBridge 事件是否中继到 ECS 任务 我看不出如果不转发该事件会有多大用处 如果事件被中继 那么如何能够从作为任务运行的节点应用程序中提取它 一些上下文是适当的 可以设置 EventBridge 规则来触发
  • C++ 部分模板特化结合 std::is_base_of 和 std::enable_if

    假设我有两个课程 Serializable and Printable 所以一个简单的模板函数接受所有派生类Printable可能看起来像 template
  • 如何使用 Spring Boot 验证和清理 HTTP Get?

    我不断从 Checkmarx 代码扫描仪收到这个恼人的错误 Method getTotalValue at line 220 of src java com example PeopleController java gets user i