1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 什么是SQL注入攻击以及如何防止SQL注入攻击

什么是SQL注入攻击以及如何防止SQL注入攻击

时间:2022-02-28 22:46:17

相关推荐

什么是SQL注入攻击以及如何防止SQL注入攻击

一、什么是SQL注入攻击?

CASE 1 :

模拟用户登陆案例

(1)准备数据

use jt_db; create table user( id int primary key auto_increment,username varchar(50), password varchar(50)); insert into user values(null,'张三','123'); insert into user values(null,'李四','234');

(2)创建LoginUser 类,提供 main 方法 和 login 方法。

public class LoginUser {/** 1.提示用户在控制台输入用户名和密码* 2.在程序中接收用户输入的用户名和密码* 3.通过JDBC程序,根据用户名和密码查询user表,如果能查询到记录,则说明用户名* 和密码正确,允许用户登录,否则,说明用户名和密码不正确,提示用户登录失败* */public static void main(String[] args) {//0.创建一个scanner对象Scanner in = new Scanner(System.in);//1.提示用户在控制台输入用户名和密码System.out.println("请登录:");System.out.println("请输入用户名");//2.在程序中接收用户输入的用户名和密码String username = in.nextLine();//3.提示输入密码并接受密码System.out.println("请输入密码");String password = in.nextLine();//4.调用login方法,登录用户login(username,password);}/*** 根据用户名和密码查询用户信息* @param username* @param password*/private static void login(String username, String password) {Connection conn = null;Statement stat = null;ResultSet rs = null;try{conn = JdbcUtil.getConn();stat = conn.createStatement();String sql = "select * from user where username = '"+username+"' and password = '"+password+"'";System.out.println(sql);rs = stat.executeQuery(sql);if(rs.next()) {System.out.println("恭喜你登陆成功");}else{System.out.println("用户名或密码不正确");}}catch(Exception e){e.printStackTrace();}finally{JdbcUtil.close(conn, stat, rs);} }}

执行时,输入:

或输入

通过上面的案例,我们发现在执行时,不输入密码只输入用户名也可以登陆成功。这就是SQL注入攻击。

SQL注入攻击产生的原因:由于后台的SQL语句是拼接而来的。其中的参数是由用户提交的,如果用户在提交参数时,在其中掺杂了一些SQL关键字或者特殊符号(比如,or # --),就可能会导致SQL语句的语意发生变化。从而执行一些意外的操作(在不知道密码的情况下也能登陆,甚至在不知道用户名和密码的情况下也能登陆),这就是SQL注入攻击。

二、如何防止SQL注入攻击?

产生SQL注入攻击的原因在于,Statement传输器在发送SQL到数据库执行时,是直接将SQL语句和参数拼接在一起,如果参数中有关键字或者特殊符号,就会导致SQL语句的语义被修改,导致意外的发生。

1.如果要解决SQL注入攻击,可以对用户提交的参数进行校验(比如采用正则表达式进行校验,该方法不推荐,原因代码繁琐。)

2.如何防止SQL注入攻击?

使用PreparedStatement对象来替代Statement对象。

添加loginByPreparedSatement方法,在方法中,使用PreparedStatement来代替Statement作为传输器对象使用!(推荐使用该方法,操作方便)

代码:

public class LoginUser2 {/** 1.提示用户在控制台输入用户名和密码* 2.在程序中接收用户输入的用户名和密码* 3.通过JDBC程序,根据用户名和密码查询user表,如果能查询到记录,则说明用户名* 和密码正确,允许用户登录,否则,说明用户名和密码不正确,提示用户登录失败* */public static void main(String[] args) {//0.创建一个scanner对象Scanner in = new Scanner(System.in);//1.提示用户在控制台输入用户名和密码System.out.println("请登录:");System.out.println("请输入用户名");//2.在程序中接收用户输入的用户名和密码String username = in.nextLine();//3.提示输入密码并接受密码System.out.println("请输入密码");String password = in.nextLine();//4.调用login方法,登录用户loginBYPS(username,password);}/*** 根据用户名和密码查询用户信息* @param username* @param password*/private static void loginBYPS(String username, String password) {Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try{//1.注册驱动并获取连接对象conn = JdbcUtil.getConn();String sql = "select * from user where username = ? and password = ?";ps= conn.prepareStatement(sql);//获取传输器//3.执行SQL语句//>>设置SQL语句的参数ps.setString(1, username);ps.setString(2, password);//>>执行SQLrs = ps.executeQuery();//不要传递SQL参数,因为前面已经传递SQL语句了if(rs.next()) {System.out.println("恭喜你登陆成功");}else{System.out.println("用户名或密码不正确");}}catch(Exception e){e.printStackTrace();}finally{JdbcUtil.close(conn, ps, rs);} }}

❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️

再次执行程序,按照上面的操作登录。此时,已经成功的防止了SQL注入攻击问题了。

使用PreparedStatement对象可以防止SQL注入攻击

而且通过方法设置参数更加的方便且不易出错!

还可以从某些方面提高程序执行的效率!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。