开发者社区> 问答> 正文

preparedstatement为什么比statement安全

preparedstatement对sql语句进行预编译,所以安全,而statement可能会有恶意sql语句的情况,就是检查登录username userpassword后跟 or 1=1这样的恶意sql语句,请问这个预编译为什么安全

展开
收起
吴孟桥 2016-06-14 16:27:34 3739 0
2 条回答
写回答
取消 提交回答
  • 关系: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

    2020-03-14 10:11:45
    赞同 展开评论 打赏
  • 预编译不是拼接字符串,所以没有sql注入的风险。拼接sql的问题是,你的参数和sql语句体本身分不出来。如果username是

    abc' or '1' = '1

    拼接上你外面的sql,就构成了一个含义不同的sql语句。

    而preparedstatement直接把参数代入编译,而不是让数据库去解析sql中的参数,就没有这个问题。

    2019-07-17 19:38:03
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Comparison of Spark SQL with H 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载