PreparedStatement与Statement的区别

PreparedStatement与Statement的区别及SQL注入
PreparedStatement与Statement在使用时的区别:

  1. Statement:sql ,executeUpdate(sql)
  2. PreparedStatement:sql(可能存在占位符?)
    在创建PreparedStatement对象时,将sql预编译prepareStatement(sql)(此为方法) executeUpdate(),setXxx()替换占位符?,比如第一个占位符?为int型,即为setInt(1),而不是setInt(0)

    推荐使用PreparedStatement原因如下:
    1.编写代码更加简便(不用字符串拼接,用setXxx()赋值)
    2.提高性能(有预编译操作,预编译只需执行一次)
    3.安全性(有效防止SQL注入)
    SQL注入是指web应用程序对用户输入数据的合法性没有判断或过滤不严,入侵者可以在web应用程序中事先定义好的查询语句的结尾上添加恶意的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而得到机密数据,泄露用户信息。(后面一篇博客有简单的java登录演示SQL注入)

怎么防止SQL注入,不要使用动态SQL;检查用户输入的合法性;将用户的登录名、密码等数据加密保存。

为什么PrepareStatement能够防止sql注入

1、preparestatement在程序第一次查询数据库之前sql语句就被数据库进行了分析、编译、优化以及具体的查询计划也都形成了。(参数位置使用占位符)

 2、当程序真正发起查询请求时,这时传递过来的参数会被认为是某个字段的值,而不会重新编译、优化,所以它不会被认为是一个sql指令。

3、如果传递进来的参数无法被看作是sql指令那么就无法形成sql注入了。如 or '1=1' 这样的参数不会被看成or指令,而是某个字段的字符串类型的值。

4、正是因为sql的执行计划是在sql编译、优化之后形成的,所以说sql注入只在编译阶段起作用。该解决方式就是不让参数参与编译阶段,而是使用占位符代替,从而解决了sql注入问题。

此问题 “为什么PrepareStatement能够防止sql注入”转载于
原文地址

©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页