Statement和PrepareStatement方法针对SQL注入式攻击的实例

SQL注入

sql注入攻击指的是通过构建特殊的输入作为参数传入web应用程序,而这些输入大都是sql语法里的一些组合,通过执行sql语句进而执行攻击者所要做的操作,其产生的主要原因在于应用程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
例如,在日常生活中,创建一个系统需要输入用户名和密码进行登录,密码错误肯定会无法进入到系统中,但是输入“or 1=1”,也会登录到系统中,这时就产生了SQL注入攻击。
该文章主要用statement和preparestatement方法来进行实例对比。

Statement方法

方法:Statement createStatement() throws SQLException
作用:创建用于向数据库发送SQL语句的一 Statement对象。不带参数的SQL语句通常用 Statement对象执行。

	Connection con = DriverManager.getConnection(url,user,pwd);
    //操作sql语句
    Statement sta = con.createStatement();

操作
创建了一个us表并赋值:
在这里插入图片描述
在这里插入图片描述
用statement方法查询id为12,pwd为422的结果。查询结果如下:
在这里插入图片描述
用同样的方法查询id为12,pwd为400的结果,由于创建的表中没有对应的值,显然输出失败。但是输入 “or 1=1”,也会输出结果。可见statement方法容易收到sql注入攻击。
在这里插入图片描述

PrepareStament方法

方法:PreparedStatement prepareStatement(String sql)throws SQLException
作用:创建参数化的SQL语句发送到数据库的 PreparedStatement对象。
一个带或不带参数的SQL语句可以被预编译并存储在一个PreparedStatement对象。此对象可以被用来有效地执行此语句多次。

●该方法有三个优点:
1、可以书写动态参数化的查询;比如where sid=?。
2、 PreparedStatement比Statement效率更高,更快。
3、防止SQL注入式攻击

操作:

检验该方法是否能够防止SQL注入攻击,在使用相同表的前提下,查询id为12以及pwd为422的值。
在这里插入图片描述
输入的:"String s = “select * from us where id=? and pwd=?”;"中加入了占位符?。该占位符只能替换值类型,不能替换表名、字段名或者其他关键词。
PreparedStatement会为占位符?的两边自动加上单引号,这样会使得SQL语句不可执行,比如使用将表名设置为占位符,数据库执行sql语句时,表名会用单引号引起来,这样会使得sql语句执行出错或者查询不出数据。

输入"or 1==1",查询id为12以及pwd为400的值,结果如下:
在这里插入图片描述
发现没有输出结果,可见使用preparestatement没有收到sql注入攻击。
总结
对于JDBC而言,SQL注入攻击只对Statement有效,对PreparedStatement是无效的,这是因为PreparedStatement不允许在插入时改变查询的逻辑结构绕过验证,但这种手段只对Statement有效,对PreparedStatement无效.

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值