出现SQL注入如何解决

  介绍

本篇文章为大家展示了出现SQL注入如何解决,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

1, SQL注入案例

模拟一个用户登录的SQL注入案例,用户在控制台上输入用户名和密码,然后使用声明字符串拼接的方式实现用户的登录。

<强> 1.1数据库中先创建用户表及数据

——,创建一张用户表   CREATE  TABLE “用户”,(   ,“id”INT (11), NOT  NULL  AUTO_INCREMENT,   ,“用户名”VARCHAR (20),   ,“密码”VARCHAR (50),   ,PRIMARY  KEY  (id)   ),引擎=INNODB  DEFAULT  CHARSET=use utf8;      ——,插入数据   INSERT  INTO 用户(用户名、密码),值(& # 39;张飞& # 39;,& # 39;123321 & # 39;),(& # 39;赵云& # 39;,& # 39;qazxsw& # 39;),(& # 39;诸葛亮& # 39;,& # 39;123年qwe& # 39;);   INSERT  INTO 用户(用户名、密码),值(& # 39;曹操& # 39;,& # 39;741258 & # 39;),(& # 39;刘备& # 39;,& # 39;plmokn& # 39;),(& # 39;孙权& # 39;,& # 39;! @ # $ % ^ & # 39;);      ——,查看数据   SELECT  *,得到用户;

出现SQL注入如何解决

<强> 1.2编写一个登录程序

package  com.study.task0201;      import  java.sql。*;   import  java.util.Scanner;      public  class  TestSQLIn  {   ,public  static  void  main (String [], args), throws  ClassNotFoundException,, SQLException  {   forname才能(“com.mysql.jdbc.Driver");   String 才能;url =,“jdbc: mysql://127.0.0.1:3306/testdb ? characterEncoding=UTF-8";   Connection 才能;conn =, DriverManager.getConnection (url,“root",“123456“);//System.out.println才能(康涅狄格州);//,才能获取语句执行平台对象,声明   Statement 才能;smt =, conn.createStatement ();      Scanner 才能;sc =, new 扫描仪(系统);   System.out.println才能(“请输入用户名:“);   String 才能;userName =, sc.nextLine ();   System.out.println才能(“请输入密码:“);   String 才能;password =, sc.nextLine ();      String 才能;sql =,“select  *,得到users  where  username =, & # 39;“, +, username  +,“& # 39;,以及password =, & # 39;“, +, password  +“& # 39;“,,,//打印出SQL   System.out.println才能(sql);   ResultSet 才能;ResultSet =, smt.executeQuery (sql);   如果才能(resultSet.next ()) {   ,,System.out.println(“登录成功! ! !“);   }{其他才能   ,,System.out.println(“用户名或密码错误,请重新输入! ! !“);   ,,}      resultSet.close才能();   smt.close才能();   conn.close才能();      ,}      }

<强> 1.3正常登录

输入正确的用户名及密码后提示“登录成功“

出现SQL注入如何解决

<强> 1.4登录失败

输入用户名或密码错误时,提示”用户名或密码错误,请重新输入”

出现SQL注入如何解决

<强> 1.5模拟SQL注入

拼接的字符串中有或& # 39;1 & # 39;=& # 39;1 & # 39;为恒成立条件,因此及时前面的用户及密码不存在也会取出所有记录,因此提示“登录成功“

出现SQL注入如何解决

<强> 1.6 SQL语法报错

使用拼接的方式,还会出现SQL语法错误等报错,例如

出现SQL注入如何解决

2。解决方案

使用声明方式,用户可以通过字符串拼接,改变原本SQL真正的含义,导致存在SQL注入的风险。解决SQL注入,可以通过预处理对象PreparedStatement来代替声明进行处理。

<强> 2.1程序

import  java.sql。*;   import  java.util.Scanner;      public  class  TestSQLIn  {   ,public  static  void  main (String [], args), throws  ClassNotFoundException,, SQLException  {   forname才能(“com.mysql.jdbc.Driver");   String 才能;url =,“jdbc: mysql://127.0.0.1:3306/testdb ? characterEncoding=UTF-8";   Connection 才能;conn =, DriverManager.getConnection (url,“root",“123456“);//System.out.println才能(康涅狄格州);//,才能获取语句执行平台对象,声明//才能,Statement  smt =, conn.createStatement ();      Scanner 才能;sc =, new 扫描仪(系统);   System.out.println才能(“请输入用户名:“);   String 才能;userName =, sc.nextLine ();   System.out.println才能(“请输入密码:“);   String 才能;password =, sc.nextLine ();      String 才能;sql =,“select  *,得到users  where  username =, ?,以及password =, ?,“;//才能,System.out.println (sql);//才能,ResultSet  ResultSet =, smt.executeQuery (sql);   PreparedStatement 才能;PreparedStatement =, conn.prepareStatement (sql);   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

出现SQL注入如何解决