PreparedStatement与Statement对比、sql语句的被注入问题
来源:互联网 发布:数据挖掘工具分类 编辑:程序博客网 时间:2024/05/02 04:51
PreparedStatement vs Statment
一、语法不同:PreparedStatement可以使用预编译的sql,而Statement只能使用静态的sql。
二、效率不同: PreparedStatement可以使用sql缓存区,效率比Statement高。
三、安全性不同: PreparedStatement可以有效防止sql注入,而Statement不能防止sql注入。
通过案例对比来给大家讲解这一点:
1、Statement模拟用户登陆:
package sram.login;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.Statement;import org.junit.Test;import sram.util.jdbc.JdbcUtil;/** * 模拟用户登录效果 */public class Demo1 { //模拟用户输入 private String name = "zhangsan"; private String password = "123"; @Test public void testByStatement(){ Connection conn = null; Statement stmt = null; ResultSet rs = null; try { //获取连接 conn = JdbcUtil.getConnection(); //创建Statment stmt = conn.createStatement(); //准备sql //注意带参的sql语句的书写 String sql = "SELECT * FROM admin WHERE userName='"+name+"' AND pwd='"+password+"'"; System.out.println(sql); //执行sql rs = stmt.executeQuery(sql); if(rs.next()){ //登录成功 System.out.println("登录成功"); }else{ System.out.println("登录失败"); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } finally { JdbcUtil.close(conn, stmt,rs); } }}
乍一看没什么问题啊,可以识别用户,判断是否登陆成功,但是接下来给大家介绍这样的一个情况:
1)首先引入这样一个概念:sql语句被注入
2)接下来我们稍稍修改下刚才的代码:
3)而PreparedStatement接口则不存在这种问题。
2、PreparedStatement模拟用户登陆:
package sram.login;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.Statement;import org.junit.Test;import sram.util.jdbc.JdbcUtil;/** * 模拟用户登录效果 */public class Demo1{ //模拟用户输入:SELECT * FROM admin WHERE userName='zhangsan' OR 1=1 -- 'AND pwd='123'; private String name = "用户随意输入' OR 1=1 -- "; private String password = "密码任意"; /** * Statment存在sql被注入的风险 */ //public void testByStatement(){} /** * PreparedStatement可以有效地防止sql被注入 */ @Test public void testByPreparedStatement(){ Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; try { //获取连接 conn = JdbcUtil.getConnection(); String sql = "SELECT * FROM admin WHERE userName=? AND pwd=?"; //预编译 stmt = conn.prepareStatement(sql); //设置参数 stmt.setString(1, name); stmt.setString(2, password); //执行sql rs = stmt.executeQuery(); if(rs.next()){ //登录成功 System.out.println("登录成功"); }else{ System.out.println("登录失败"); } System.out.println(sql); System.out.println(stmt); System.out.println(rs); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } finally { JdbcUtil.close(conn, stmt ,rs); } }}
运行结果:
推荐使用PreparedStatement
1 0
- PreparedStatement与Statement对比、sql语句的被注入问题
- sql注入的问题,PreparedStatement
- Statement和PreparedStatement之间的区别以及sql注入
- Statement的sql注入问题
- PreparedStatement 与 Statement 的区别 —— 理解动态SQL语句的执行机制
- PreparedStatement的用法及与statement的对比
- PreparedStatement对象替代Statement解决sql注入
- JDBC之SQL注入,PreparedStatement和Statement
- Statement和PreparedStatement的区别; 什么是SQL注入,怎么防止SQL注入?
- SQL语句(statement)预处理(preparedStatement)
- SQl之PreparedStatement与Statement的区别---------( 二 )
- 第七章 Statement的sql注入问题
- Statement与PreparedStatement的区别
- Statement与PreparedStatement的区别
- PreparedStatement与Statement的区别
- PreparedStatement 与 Statement 的区别
- PreparedStatement与statement的区别
- 无聊的statement 与 preparedstatement
- 15种排序方法 未完结
- QQ空间后台架构优化之路
- Eclipse菜单栏 source Refactor详解
- 操作系统实践之第二章(分页机制)
- KVC/KVO原理详解及编程指南
- PreparedStatement与Statement对比、sql语句的被注入问题
- LeetCode笔记:160. Intersection of Two Linked Lists
- 动态规划 矩阵连乘问题
- d3.js 可视化学习笔记(二)——svg导出png保存
- 关于ajax后台响应信息传递的问题
- 上升沿、高/低电平
- QT项目开发之数据库模型
- 机器学习之最小二乘法
- 安卓中的dp——田少嵩