关于防sql注入

来源:互联网 发布:java 未来前景 编辑:程序博客网 时间:2024/05/22 07:57

在学习mybatis之前了解过防SQL注入,当时一般是用java提供是statement来执行查询语句。

但这样就会遇到一个问题,黑客攻击者可以通过在SQL语句后加入一些SQL片段例如(or '1'='1'),这样就能获得到数据库中是其他数据

针对这个问题java有提供了另一个api就是preparedstatement,通过调用connection.preparedStatement(sql)得到对象。

使用preparedstatement进行查询时,数据库会先将SQL语句进行预编译处理,被编译好后可以重复使用,效率比statement高。

SQL注入都是在SQL编译时气作用,这样就避免了SQL注入。

编译时可以将不确定的参数用占位符'?'表示,执行的时候在用参数将占位符替换。

以上是java提供是api进行SQL查询,当我们用到mybatis框架时。SQL语句还是要自己写,因此也存在SQL注入。这时我们可以这样写

<select id="getBlogById" resultType="Blog" parameterType=”int”>

         SELECT id,title,author,content

         FROM blog

WHERE id=#{id}

</select>

MyBatis启用了预编译功能,在SQL执行前,会先将上面的SQL发送给数据库进行编译;执行时,直接使用编译好的SQL,替换占位符“?”就可以了。

因为SQL注入只能对编译过程起作用,所以这样的方式就很好地避免了SQL注入的问题。

#{}:相当于JDBC中的PreparedStatement

${}:是输出变量的值

简单说,#{}是经过预编译的,是安全的${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。