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和PrepareStatement方法针对SQL注入式攻击的实例_第1张图片
Statement和PrepareStatement方法针对SQL注入式攻击的实例_第2张图片
用statement方法查询id为12,pwd为422的结果。查询结果如下:
Statement和PrepareStatement方法针对SQL注入式攻击的实例_第3张图片
用同样的方法查询id为12,pwd为400的结果,由于创建的表中没有对应的值,显然输出失败。但是输入 “or 1=1”,也会输出结果。可见statement方法容易收到sql注入攻击。
Statement和PrepareStatement方法针对SQL注入式攻击的实例_第4张图片

PrepareStament方法

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

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

操作:

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

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

你可能感兴趣的:(sql,数据库,java)