1、SQL注入攻击:
     由于dao中执行的SQL语句是拼接出来的,其中有一部分内容是由用户从客户端传入,所以当用户传入的数据中包含sql关键字时,就有可能通过这些关键字改变sql语句的语义,从而执行一些特殊的操作,这样的攻击方式就叫做sql注入攻击
  
    PreparedStatement利用预编译的机制将sql语句的主干和参数分别传输给数据库服务器,从而使数据库分辨的出哪些是sql语句的主干哪些是参数,这样一来即使参数中带了sql的关键字,数据库服务器也仅仅将他当作参数值使用,关键字不会起作用,从而从原理上防止了sql注入的问题

PreparedStatement主要有如下的三个优点:
   1.可以防止sql注入
   2.由于使用了预编译机制,执行的效率要高于Statement
   3.sql语句使用?形式替代参数,然后再用方法设置?的值,比起拼接字符串,代码更加优雅.

PreparedStatement 与Statment比较

1)语法不同:PreparedStatement可以使用预编译的sql,而Statment只能使用静态的sql

2)效率不同: PreparedStatement可以使用sql缓存区,效率比Statment高

3)安全性不同: PreparedStatement可以有效防止sql注入,而Statment不能防止sql注入。

/*** PreparedStatement執行sql語句* **/
public class Demo1 {/*** 增加*/@Testpublic void testInsert() {Connection conn = null;PreparedStatement stmt = null;try {//1.获取连接conn = JdbcUtil.getConnection();//2.准备预编译的sqlString sql = "INSERT INTO student(NAME,gender) VALUES(?,?)"; //?表示一个参数的占位符//3.执行预编译sql语句(检查语法)stmt = conn.prepareStatement(sql);//4.设置参数值/*** 参数一: 参数位置  从1开始*/stmt.setString(1, "李四");stmt.setString(2, "男");//5.发送参数,执行sqlint count = stmt.executeUpdate();System.out.println("影响了"+count+"行");} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);} finally {JdbcUtil.close(conn, stmt);}}/*** 修改*/@Testpublic void testUpdate() {Connection conn = null;PreparedStatement stmt = null;try {//1.获取连接conn = JdbcUtil.getConnection();//2.准备预编译的sqlString sql = "UPDATE student SET NAME=? WHERE id=?"; //?表示一个参数的占位符//3.执行预编译sql语句(检查语法)stmt = conn.prepareStatement(sql);//4.设置参数值/*** 参数一: 参数位置  从1开始*/stmt.setString(1, "王五");stmt.setInt(2, 9);//5.发送参数,执行sqlint count = stmt.executeUpdate();System.out.println("影响了"+count+"行");} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);} finally {JdbcUtil.close(conn, stmt);}}/*** 删除*/@Testpublic void testDelete() {Connection conn = null;PreparedStatement stmt = null;try {//1.获取连接conn = JdbcUtil.getConnection();//2.准备预编译的sqlString sql = "DELETE FROM student WHERE id=?"; //?表示一个参数的占位符//3.执行预编译sql语句(检查语法)stmt = conn.prepareStatement(sql);//4.设置参数值/*** 参数一: 参数位置  从1开始*/stmt.setInt(1, 9);//5.发送参数,执行sqlint count = stmt.executeUpdate();System.out.println("影响了"+count+"行");} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);} finally {JdbcUtil.close(conn, stmt);}}/*** 查询*/@Testpublic void testQuery() {Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;try {//1.获取连接conn = JdbcUtil.getConnection();//2.准备预编译的sqlString sql = "SELECT * FROM student"; //3.预编译stmt = conn.prepareStatement(sql);//4.执行sqlrs = stmt.executeQuery();//5.遍历rswhile(rs.next()){int id = rs.getInt("id");String name = rs.getString("name");String gender = rs.getString("gender");System.out.println(id+","+name+","+gender);}} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);} finally {//关闭资源
            JdbcUtil.close(conn,stmt,rs);}}
}

eg:模拟登陆

/*** 模拟用户登录效果* **/
public class Demo2 {//模拟用户输入//private String name = "ericdfdfdfddfd' OR 1=1 -- ";private String name = "eric";//private String password = "123456dfdfddfdf";private String password = "123456";/*** Statment存在sql被注入的风险*/@Testpublic void testByStatement(){Connection conn = null;Statement stmt = null;ResultSet rs = null;try {//获取连接conn = JdbcUtil.getConnection();//创建Statmentstmt = conn.createStatement();//准备sqlString sql = "SELECT * FROM users WHERE NAME='"+name+"' AND PASSWORD='"+password+"'";//执行sqlrs = 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);}}/*** PreparedStatement可以有效地防止sql被注入*/@Testpublic void testByPreparedStatement(){Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;try {//获取连接conn = JdbcUtil.getConnection();String sql = "SELECT * FROM users WHERE NAME=? AND PASSWORD=?";//预编译stmt = conn.prepareStatement(sql);//设置参数stmt.setString(1, name);stmt.setString(2, password);//执行sqlrs = stmt.executeQuery();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);}}
}

转载于:https://www.cnblogs.com/flei/p/6727520.html

jdbc之防sql注入攻击相关推荐

  1. 超强JSP防SQL注入攻击

    第一种采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setString方法传值即可: String sql= "select * from users where userna ...

  2. C# 检查字符串,防SQL注入攻击(转载)

    这些天,CSDN上讨论SQL注入攻击似乎是如火如荼啊...我也来参合一下..如下,CheckParams函数,接收参数任意,如参数中有字符串,则对字符串进行检查,如参数中有集合(如Array之类,总之 ...

  3. Godaddy服务器上关于ASP.NET网站建设一些经验 - 防SQL注入攻击(三)

    作者: 阙荣文 ( querw ) 什么是SQL注入攻击,有什么危害 先来看一个例子说说SQL注入攻击是怎么回事,有什么危害. 在有用户参与的网站中,所有操作中最重要的就是登录.要求用户输入用户名和密 ...

  4. PHP几个防SQL注入攻击自带函数区别

    为了防止SQL注入攻击,PHP自带一个功能可以对输入的字符串进行处理,可以在较底层对输入进行安全上的初步处理,也即Magic Quotes.(php.ini magic_quotes_gpc).如果m ...

  5. php如何防sql注入攻击,php防sql注入攻击(含php6)

    网站攻击最常见的就是sql注入式攻击了,防范于未然很重要- PHP可以开启环境变量配置为POST.GET.REQUEST.COOKIE等用户传过来的参数值自动增加转义字符"\",以 ...

  6. PHP防SQL注入攻击

    一般性的防注入,只要使用php的 addslashes 函数就可以了. PHP代码 $_POST = sql_injection($_POST); $_GET = sql_injection($_GE ...

  7. Java程序员从笨鸟到菜鸟之(一百)sql注入攻击详解(一)sql注入原理详解

    前段时间,在很多博客和微博中暴漏出了12306铁道部网站的一些漏洞,作为这么大的一个项目,要说有漏洞也不是没可能,但其漏洞确是一些菜鸟级程序员才会犯的错误.其实sql注入漏洞就是一个.作为一个菜鸟小程 ...

  8. 什么是SQL注入攻击?

    1 什么是SQL注入? 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.比如先前的很多影视网站泄露VIP会员密码大多就 ...

  9. sql sp_password登录名不存在或 权限_什么是SQL注入攻击?怎么预防?

    转自CSDN,作者hellochenlu/网易号,云计算那些事 互联网的攻击形式千万种,威胁最大的独一份,就是SQL注入了!由于它的危害之大,它也成为了每一个运维工程师为客户部署业务系统前必做的防御. ...

最新文章

  1. inject 响应式_vue 的 provide 和 inject 依赖注入与 $parent
  2. 关于log4net使用中遇到的错误
  3. gcp上使用gpu来学习tensorflow
  4. 关于硬件信息和体系信息
  5. YbtOJ#20068-[NOIP2020模拟赛B组Day5]连通子图【构造】
  6. JavaScript中的元素获取与操作
  7. jhipster详解
  8. Linux修改文件时候出现崩溃,产生了一个.swap交换文件,如何修复?
  9. 基于堆叠式长短期记忆神经网络模型StackingLSTM的时间序列数据预测模型构建
  10. 【STM32】Keil v5下载与安装
  11. 操作 神通数据库_国产神通数据库教程
  12. 怎么安装64位JAVA,大师来详解
  13. 电池SOC仿真系列-基于RNN的电池SOC估算研究
  14. Apple: Mac OS X美洲狮10.8的硬件兼容列表
  15. 《Love and Math》(1)
  16. 关于Johnson-Trotter和字典序排列在《算法设计与分析基础》中的论述
  17. 关于川大667和972自命题考试的心得
  18. IDEA类左侧有一个对勾,如何去掉对勾?
  19. 四大美女 沉鱼-->西施 落雁-->王昭君 闭月-->貂禅 羞花-->杨玉环
  20. MySQL优化之超大分页查询

热门文章

  1. ibatis如何支持clob 和blob
  2. nginx 同一个端口支持 http https_Nginx
  3. Docker Swarm集群config集中管理配置文件
  4. POJ3041 最小顶点覆盖
  5. 【C 语言】多级指针 ( 在函数中生成 二级指针 | 通过传入的 三级指针 进行间接赋值 )
  6. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | AMS 启动前使用动态代理替换掉插件 Activity 类 )
  7. 【组合数学】非降路径问题 ( 非降路径问题概要说明 | 非降路径问题基本模型 | 非降路径问题拓展模型 1 非原点起点 | 非降路径问题拓展模型 2 有途经点 )
  8. 【错误记录】Android 应用连接 BLE 设备无法读取数据 ( 可以写出数据 | 无法读取数据 )
  9. 【数据挖掘】神经网络 后向传播算法 向前传播输入 案例计算分析 ( 网络拓扑 | 输入层计算 | 隐藏层计算 | 输出层计算 )
  10. 【Android NDK 开发】Android Studio 的 NDK 配置 ( 源码编译配置 | 构建脚本配置 | 打包配置 | CMake 配置 | ndkBuild 配置 )