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

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

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语句在数据库里执行就是这样sql

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

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

相关文章
相关标签/搜索