我不断从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())。
Jsoup.clean(personName, Whitelist.basic())
我想我做了所有必要的验证。还有什么???
首先,您需要了解控制器的应用程序级别 输入卫生 和业务级别 输入验证 之间的区别。您在这里所做的是第二部分,第一部分可能是您设置中缺少的,而这完全是出于安全性的考虑,通常是针对整个应用程序进行设置。
您正在使用@Size批注来限制输入的大小,但这不能保证坏字符串-可能导致XSS攻击的字符串。然后,您正在使用call Jsoup.clean(personName,Whitelist.basic()))清理此已验证大小的输入。由于我不确定该调用的作用,因此您需要确保新值是XSS-Safe。您会立即将该值传递给数据库调用,然后将其返回Integer给调用者/客户端,因此我对这里发生XSS攻击的可能性非常悲观,但是工具却这么说。
@Size
Jsoup.clean(personName,Whitelist.basic()))
Integer
正如我之前解释的那样,输入验证是一个通常用于业务逻辑级别输入验证的术语,而输入清理/清理是关于安全性的。在Spring Boot环境中,这通常是通过使用 Spring Security API 并启用XSS过滤器或编写自己的XSS过滤器并将其插入应用程序来完成的。首先是筛选器,然后是控制器,因此控制器将始终具有经过净化的价值,并且您将对该经过净化的价值进行业务验证。
这是一个广泛的答案和代码,您可能会用到谷歌。还建议阅读更多有关XSS攻击的信息。只需了解有多种方法可以实现相同的目标。
在最后一个链接中,提到了
防止这种攻击的第一步是输入验证。用户输入的所有内容均应精确验证,因为用户的输入可能会找到输出的方式。
&您没有在代码中进行操作,因此我猜没有XSS。
编辑:
XSS安全性有两个方面- 首先,不允许对服务器端代码进行恶意输入;这可以通过使用XSS过滤器来完成;有时,允许恶意输入没有任何危害(假设您将恶意输入保存到数据库中,或者在API响应中返回)。
第二方面是指导HTML客户端有关可能的XSS攻击(如果我们确定API客户端将是HTML / UI的话),那么我们需要添加X-XSS- Protection标头,并通过以下代码完成。这将使浏览器可以打开其XSS保护功能(如果有)。
X-XSS- Protection
@Override受保护的void configure(HttpSecurity http)引发异常{
http.headers().xssProtection()....
}
我想,我在上面错误地写道,SpringSecurity提供了输入卫生过滤器,我猜是没有。将会验证并告知您。我已经在回答此问题的行上编写了自定义过滤器-在Spring MVC控制器中防止XSS
您还必须了解,Spring Boot也习惯于编写传统的MVC应用程序,其中服务器端也提供HTML来呈现。对于JSON响应(REST API),UI客户端可以控制要转义的内容和不进行转义的内容,因此会产生复杂性,因为JSON输出并不总是馈送到HTML客户端(也就是浏览器)。