转!! PreparedStatement是如何防止SQL注入的

SQL注入最简单也是最常见的例子就是用户登陆这一模块,如果用户对SQL有一定的了解,同时系统并没有做防止SQL注入处理,用户可以在输入的时候加上’两个冒号作为特殊字符,这样的话会让计算机认为他输入的是SQL语句的关键字从而改变你的SQL语句,造成不可估量的损失。 
在JDBC中通常会使用PreparedStatement来代替Statement来处理sql语句,如

            String sql = "select * from t_user where password = ?";
            pt = conn.prepareStatement(sql);
            pt.setString(1, num);  
            rs = pt.executeQuery();

使用PreparedStatement的好处是数据库会对sql语句进行预编译,下次执行相同的sql语句时,数据库端不会再进行预编译了,而直接用数据库的缓冲区,提高数据访问的效率,如果sql语句只执行一次,以后不再复用。 
SQL注入 攻 击 只 对 Statement有效, 对 PreparedStatement 是无效的; 
PreparedStatement可以在传入sql后,执行语句前,给参数赋值,避免了因普通的拼接sql字符串语句所带来的安全问题,而且准备sql和执行sql是在两个语句里面完成的,也提高了语句执行的效率 比如单引号会给你加一个转义,加个斜杠。上面的sql语句在数据库里执行就是这样

select * from t_user where password='ddd\' or \'1\'=\'1';

它会把恶意的注入语句预处理为参数

posted @ 2017-01-04 11:20  乌云de博客  阅读(6194)  评论(0编辑  收藏  举报