gpt4 book ai didi

java - 如何配置 Spring Controller 和/或 JAXB 以帮助防止 SQL/XSS 注入(inject)

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:02:27 25 4
gpt4 key购买 nike

我在 Spring 中有一个 Controller ,其方法如下所示

@RequestMapping(value = "/v1/something", method = RequestMethod.POST, headers = "content-type=application/xml")
@Valid
public void something(@RequestBody final SomeBody myDto . . . . .

我想确保请求主体不包含任何 SQL 或 Javascript 字符,以帮助避免 SQL 注入(inject)、XSS 攻击等。

JAXB 是否已处理该场景?我正在考虑编写一个过滤器,但我只能读取一次请求正文?

有什么建议吗?

最佳答案

正确的 XSS 和 SQL 注入(inject)保护(以及一般的数据验证)只能发生在服务器端。客户端验证无关紧要,因为恶意用户可以编写自己的客户端或发送自定义 HTTP 请求。客户端验证仅用于在没有服务器往返的情况下通知非恶意用户表单验证(例如:验证字段是数字或电子邮件地址)。即使在那种情况下,服务器也必须执行验证。

为防止 SQL 注入(inject),为所有 参数化查询使用绑定(bind)变量(例如准备好的语句)。您永远不必连接客户端输入来生成 SQL 语句。如果您从不从客户端输入生成 SQL 语句并且只将它们用作绑定(bind)变量,那么您根本不必担心 SQL 注入(inject)。

String clientValue = ...
Connection conn = ...
PreparedStatement stmt = conn.prepare("INSERT INTO foobar VALUES (?)");
stmt.setString(clientValue);
stmt.executeUpdate();

或者使用 Spring JDBC:

String clientValue = ...
JdbcTemplate jdbcTemplate = ...
jdbcTemplate.update("INSERT INTO foobar VALUES (?)", clientValue);

要防止 XSS,请确保在输出 之前清理所有数据。如果您有一个明确的可接受文本子集,那么在保存时将客户端数据列入白名单通常也是一个好主意,但是当您考虑 Unicode 支持时,它会变得更加复杂。通常在渲染端处理它要容易得多。

例如,如果您正在使用 JSTL 来呈现您的输出,您将使用如下内容:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
${fn:escapeXml(myModelVariable)}

关于java - 如何配置 Spring Controller 和/或 JAXB 以帮助防止 SQL/XSS 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16405608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com