PreparedStatement与Statement的区别及SQL注入
PreparedStatement与Statement在使用时的区别:
- Statement:sql ,executeUpdate(sql)
- 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注入”转载于
原文地址