PrepareStatement为什么能起到防止SQL注入的作用??

PrepareStatement

使用它执行含有动态信息的SQL语句

优点:

1、没有SQL注入问题

2、编写简单

3、批量执行语义相同的SQL语句时会重用执行计划

Statement:适合执行静态SQL语句

String sql="update cz_zj_directpayment dp"+
 "set dp.projectid = ? where dp.payid= ?";
try {
	PreparedStatement pset_f = conn.prepareStatement(sql);
	pset_f.setString(1,inds[j]);
	pset_f.setString(2,id);
	pset_f.executeUpdate(sql_update);
}catch(Exception e){
	//e.printStackTrace();
	logger.error(e.message());
}
那为什么它这样处理就能预防SQL注入提高安全性呢?其实是因为SQL语句在程序运行前已经进行了预编译,在程序运行时第一次操作数据库之前,SQL语句已经被数据库分析,编译和优化,对应的执行计划也会缓存下来并允许数据库已参数化的形式进行查询,当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or '1=1',数据库也会作为一个参数一个字段的属性值来处理,而不会作为一个SQL指令,如此,就起到了SQL注入的作用了!

猜你喜欢

转载自blog.csdn.net/qq_38369069/article/details/80906004
今日推荐