我在Spring中有一个Controller,其方法如下
@RequestMapping(value = "/v1/something", method = RequestMethod.POST, headers = "content-type=application/xml") @Valid public void something(@RequestBody final SomeBody myDto . . . . .
我想确保Request Body不包含任何SQL或Javascript字符,以帮助避免SQL注入,XSS攻击等.
JAXB是否已经处理过这种情况?我正在考虑编写一个过滤器,但我只能阅读一次请求体?
有什么建议?
正确的XSS和SQL注入保护(以及一般的数据验证)只能在服务器端进行.客户端验证无关紧要,因为恶意用户只能编写自己的客户端或发送自定义HTTP请求.客户端验证仅用于在没有服务器往返的情况下通知非恶意用户表单验证(例如:验证字段是数字或电子邮件地址).即使在那种情况下,服务器也必须执行验证.
为了防止SQL注入,请对所有参数化查询使用绑定变量(例如预处理语句).您永远不必连接客户端输入以生成SQL语句.如果您从不从客户端输入生成SQL语句并仅将它们用作绑定变量,则根本不必担心SQL注入.
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)}