preparedstatement对sql语句进行预编译,所以安全,而statement可能会有恶意sql语句的情况,就是检查登录username userpassword后跟 or 1=1这样的恶意sql语句,请问这个预编译为什么安全
关系:PreparedStatement继承自Statement,都是接口 区别:PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高
恶义 SQL 语法
String sql = “select * from tb_name where name= ‘”+varname+”’ and passwd=’”+varpasswd+”’”;
如果我们把 [’ or ‘1’ = ‘1] 作为 varpasswd 传入进来 . 用户名随意 , 看看会成为什么 ?
select * from tb_name = ’ 随意 ’ and passwd = ” or ‘1’ = ‘1’;
因为 ‘1’=’1’ 肯定成立 , 所以可以任何通过验证 . 更有甚者 :
把 [‘;drop table tb_name;] 作为 varpasswd 传入进来 , 则 :
select * from tb_name = ’ 随意 ’ and passwd = ”;drop table tb_name; 有些数据库是不会让你成功的 , 但也有很多数据库就可以使这些语句得到执行 .
而如果你使用预编译语句 . 你传入的任何内容就不会和原来的语句发生任何匹配的关系 。
只要全使用预编译语句 , 你就用不着对传入的数据做任何过虑 。
而如果使用普通的 statement, 有可能要对 drop,; 等做费尽心机的判断和过虑 ———————————————— 版权声明:本文为CSDN博主「风吟_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_29924227/article/details/81046800
预编译不是拼接字符串,所以没有sql注入的风险。拼接sql的问题是,你的参数和sql语句体本身分不出来。如果username是
abc' or '1' = '1
拼接上你外面的sql,就构成了一个含义不同的sql语句。
而preparedstatement直接把参数代入编译,而不是让数据库去解析sql中的参数,就没有这个问题。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。