我如何防止人们在 Spring MVC 中执行 XSS?

新手上路,请多包涵

在 Spring MVC 中,我应该怎么做才能防止 XSS?现在我只是将我输出用户文本的所有地方放入 JSTL <c:out> 标签或 fn:escapeXml() 函数,但这似乎容易出错,因为我可能会错过一个地方。

有没有一种简单的系统方法可以防止这种情况发生?也许像过滤器之类的?我通过在我的控制器方法上指定 @RequestParam 参数来收集输入。

原文由 Doug 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 589
2 个回答

在 Spring 中,您可以从 <form> 标记生成的 JSP 页面中转义 html。这关闭了很多 XSS 攻击的途径,并且可以通过三种方式自动完成:

对于 web.xml 文件中的整个应用程序:

 <context-param>
    <param-name>defaultHtmlEscape</param-name>
    <param-value>true</param-value>
</context-param>

对于文件本身给定页面上的所有表单:

 <spring:htmlEscape defaultHtmlEscape="true" />

对于每种形式:

 <form:input path="someFormField" htmlEscape="true" />

原文由 Tendayi Mawushe 发布,翻译遵循 CC BY-SA 3.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 的评论

CVE-2019-10219 和@SafeHtml 的状态

我们已获悉与 @SafeHtml 约束相关的 CVE-2019-10219,它已在 6.0.18.Final 和 6.1.0.Final 中修复….

然而,我们得出的结论是,@SafeHtml 约束是脆弱的、高度安全敏感的,并且依赖于并非为此目的而设计的外部库。将它包含在核心 Hibernate Validator 中并不是一个好主意。这就是我们弃用它并将其标记为删除的原因。这里没有神奇的计划,所以我们的用户将不得不自己维护这个约束

为自己恢复:它是安全的,可以使用,直到找到更好的解决方案。

更新:由于删除 @SafeHtml/SafeHtmlValidatorhibernate.validator 使用自己的 NoHtmlValidator ,请参阅 https://stackoverflow.com/a8460/618

原文由 Grigory Kislin 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题