在 Spring MVC 中,我应该怎么做才能防止 XSS?现在我只是将我输出用户文本的所有地方放入 JSTL <c:out>
标签或 fn:escapeXml()
函数,但这似乎容易出错,因为我可能会错过一个地方。
有没有一种简单的系统方法可以防止这种情况发生?也许像过滤器之类的?我通过在我的控制器方法上指定 @RequestParam
参数来收集输入。
原文由 Doug 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 Spring MVC 中,我应该怎么做才能防止 XSS?现在我只是将我输出用户文本的所有地方放入 JSTL <c:out>
标签或 fn:escapeXml()
函数,但这似乎容易出错,因为我可能会错过一个地方。
有没有一种简单的系统方法可以防止这种情况发生?也许像过滤器之类的?我通过在我的控制器方法上指定 @RequestParam
参数来收集输入。
原文由 Doug 发布,翻译遵循 CC BY-SA 4.0 许可协议
我通过 @Valid
使用 Hibernate Validator — 用于所有输入对象(绑定和 @RequestBody
json,参见 https://dzone.com/articles/spring-31-valid-requestbody )。所以 @org.hibernate.validator.constraints.SafeHtml
对我来说是一个很好的解决方案。
Hibernate SafeHtmlValidator
依赖于 org.jsoup
,所以需要多加一个项目依赖:
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.1</version>
</dependency>
对于 bean User
带字段
@NotEmpty
@SafeHtml
protected String name;
在控制器中尝试更新值 <script>alert(123)</script>
@PutMapping(value = "/{id}", consumes = MediaType.APPLICATION_JSON_VALUE)
public void update(@Valid @RequestBody User user, @PathVariable("id") int id)
或者
@PostMapping
public void createOrUpdate(@Valid User user) {
抛出 BindException
用于绑定和 MethodArgumentNotValidException
用于 @RequestBody
带有默认消息:
name may have unsafe html content
验证器也适用于绑定,就像在持久化之前一样。可以在 http://topjava.herokuapp.com/ 测试应用程序
更新:另请参阅@GuyT 的评论
我们已获悉与 @SafeHtml 约束相关的 CVE-2019-10219,它已在 6.0.18.Final 和 6.1.0.Final 中修复….
然而,我们得出的结论是,@SafeHtml 约束是脆弱的、高度安全敏感的,并且依赖于并非为此目的而设计的外部库。将它包含在核心 Hibernate Validator 中并不是一个好主意。这就是我们弃用它并将其标记为删除的原因。这里没有神奇的计划,所以我们的用户将不得不自己维护这个约束
为自己恢复:它是安全的,可以使用,直到找到更好的解决方案。
更新:由于删除 @SafeHtml/SafeHtmlValidator
从 hibernate.validator
使用自己的 NoHtmlValidator
,请参阅 https://stackoverflow.com/a8460/618
原文由 Grigory Kislin 发布,翻译遵循 CC BY-SA 4.0 许可协议
8 回答6.4k 阅读
1 回答2.2k 阅读✓ 已解决
1 回答1.9k 阅读✓ 已解决
2 回答1.3k 阅读
2k 阅读
1 回答955 阅读
1 回答843 阅读
在 Spring 中,您可以从
<form>
标记生成的 JSP 页面中转义 html。这关闭了很多 XSS 攻击的途径,并且可以通过三种方式自动完成:对于
web.xml
文件中的整个应用程序:对于文件本身给定页面上的所有表单:
对于每种形式: