preparedStatement是如何防止SQL注入的?

182 阅读1分钟

在使用SQL的时候,会有漏洞。这是sql机制的问题

对于静态的sql语句,使用statement执行 如果被恶意攻击

比如一个删除语句,一旦在句尾拼接”or 1=1“,id = 1这个条件就没有用了,整个person表的信息都会被删除,这就是SQL注入

String sql = "delete from person where id = 1 or 1=1";
int i = statement.executeUpdate(sql);

很明显,搬运工对象Statement 是无法防止SQL注入的,而预处理搬运工对象,是可以防止SQL注入

预处理搬运工对象处理的是参数化的sql语句,比如:

String sql = "delete from user where id = ? ";

preparedStatement对象会先将带有?的参数化的sql语句预编译一次(效率也更高),之后再将用户的输入作为参数替换进preparedStatement中。这个删除语句只有一个参数占位符?,意味着我们只能传入一个参数。假如我们传入一个”1“,就会正常执行,但如果这个参数被拼接成”1 or 1=1“,对preparedStatement来说,一个空格代表开始了一个参数,这里是3个参数,与占位符的个数不匹配,就会报错,语句将不执行。

这也是为什么开发中我们一般用preparedStatement而不用statement。