遇见SQL注入应该如何解决
这篇文章主要介绍了遇见SQL注入应该如何解决,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。
SQL
注入是什么?
看一下百度百科的定义:
啊,好长一大段文字,些许不想看,下面通过一个例子,来说明一下什么是SQL注入
:
新建一个数据库,再建一个表,添加两行数据:
usedb1;createtableuser(idintprimarykeyauto_increment,usernamevarchar(32),passwordvarchar(32));insertintouservalues(null,'zhangsan','123');insertintouservalues(null,'lisi','234');
表如下图所示:
再随随便便用JDBC
写个登陆操作:
packagecom.wzq.jdbc;importcom.wzq.util.JDBCUtils;importjava.sql.Connection;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;importjava.util.Scanner;/**需求:*1、通过键盘录入用户名和密码*2、判断用户是否登陆成功**/publicclassJDBCDemo05{publicstaticvoidmain(String[]args){Scannercin=newScanner(System.in);System.out.println("请输入用户名:");Stringusername=cin.nextLine();System.out.println("请输入密码:");Stringpassword=cin.nextLine();booleanres=newJDBCDemo05().login(username,password);if(res)System.out.println("登陆成功!");elseSystem.out.println("登陆失败!");}publicbooleanlogin(Stringusername,Stringpassword){if(username==null||password==null){returnfalse;}Connectionconn=null;Statementstmt=null;ResultSetrs=null;try{//1、获取数据库连接conn=JDBCUtils.getConnection();//JDBCUtils工具类//2、定义sqlStringsql="select*fromuserwhereusername='"+username+"'andpassword='"+password+"'";//3、获取执行sql的对象stmt=conn.createStatement();//4、执行sqlrs=stmt.executeQuery(sql);returnrs.next();}catch(SQLExceptione){e.printStackTrace();}finally{JDBCUtils.close(rs,stmt,conn);}returnfalse;}}
测试一下:
可以看到,普通的检验没有任何问题,现在使用SQL注入
:
账户名称随便输入,密码输入:a' or 'a'='a
惊讶的发现,居然登陆成功了。输出一下sql
看一下:
select*fromuserwhereusername='askjdhjksahd'andpassword='a'or'a'='a'
可以看到where
之后的条件,无论是什么结果都为真,都会输出整个表:
所以,综上所述:在sql
拼接时,有一些sql
的特殊关键字参与字符串的拼接,就会造成安全性问题,这就是上面为什么能登陆成功的原因所在。
那怎么解决这个问题呢?
答:利用PreparedStatement
对象,不使用Statement
对象。
PreparedStatement
对象是Statement
对象的子类,它是预编译的sql
,所以运行速度会比Statemnet
更快。
PerpaerdStatement
使用?
作为占位符,使用setXxx(索引,值)
给?
赋值
所以我们替换一下Statement
,写一下代码:
publicbooleanlogin(Stringusername,Stringpassword){if(username==null||password==null){returnfalse;}Connectionconn=null;PreparedStatementpstmt=null;ResultSetrs=null;try{//1、获取数据库连接conn=JDBCUtils.getConnection();//JDBCUtils类//2、定义sqlStringsql="select*fromuserwhereusername=?andpassword=?";//3、获取执行sql的对象pstmt=conn.prepareStatement(sql);pstmt.setString(1,username);pstmt.setString(2,password);//4、执行sqlrs=pstmt.executeQuery();returnrs.next();}catch(SQLExceptione){e.printStackTrace();}finally{JDBCUtils.close(rs,pstmt,conn);}returnfalse;}
测试一下:
成功解决!
以上就是遇见SQL注入应该如何解决的详细内容了,看完之后是否有所收获呢?如果想了解更多相关内容,欢迎来亿速云行业资讯!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。