Spring JDBC是否提供针对SQL注入攻击的任何保护?

bra*_*ter 26 spring sql-injection jdbctemplate

Spring的JdbcTemplate抽象提供了许多功能,但它是否可以以提供SQL注入攻击保护的方式使用?

例如,就像使用PreparedStatement并使用正确定义的参数化获得的保护类型一样.

Don*_*ows 29

它肯定会.这个例子直接来自Spring 3.0文档(但在2.*中是相同的):

String lastName = this.jdbcTemplate.queryForObject( 
        "select last_name from t_actor where id = ?", 
        String.class, 1212L); 
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它强烈支持预处理语句(它必须在幕后使用):使用占位符(?)指定参数并提供填充参数的对象数组.(最后一个参数是预期结果的类型,但这与此问题不太相关.)

您也可以使用a NamedParameterJdbcTemplate并提供a中的参数Map,这可能效率较低,但肯定更具助记符.

  • 你好,`this.jdbcTemplate.queryForObject("select last_name from t_actor where id = " + id); ` 也安全吗? (2认同)
  • @TheUnreal当然这取决于你的id来自哪里以及它的类型是什么可能作为SQL注入,但它绝对可以被利用。假设 id 是一个字符串,并且您直接从客户端发送给您的内容中将其传递下来(因此,无论是输入字段,还是显式更改的获取请求,或者其他什么,...),他们可以使 id = "someId; DROP表 t_actor;”。根据您的底层数据库及其允许的功能,他们可能会删除表,执行任何其他任意选择的查询,...安全总比抱歉好,使用参数化查询;) (2认同)