在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

SQL注入怎么解决

99次阅读
没有评论

共计 3313 个字符,预计需要花费 9 分钟才能阅读完成。

自动写代码机器人,免费开通

丸趣 TV 小编给大家分享一下 SQL 注入怎么解决,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

前言

SQL 注入即是指 web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

1、SQL 注入案例

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

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

--  创建一张用户表
CREATE TABLE `users` ( `id` INT(11) NOT NULL AUTO_INCREMENT,
 `username` VARCHAR(20),
 `password` VARCHAR(50),
 PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
--  插入数据
INSERT INTO users(username,`password`) VALUES(张飞 , 123321),(赵云 , qazxsw),( 诸葛亮 , 123Qwe 
INSERT INTO users(username,`password`) VALUES(曹操 , 741258),(刘备 , plmokn),( 孙权 , !@#$%^ 
--  查看数据
SELECT * FROM users;

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 {
 Class.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(conn);
 //  获取语句执行平台对象  Statement
 Statement smt = conn.createStatement();
 Scanner sc = new Scanner(System.in);
 System.out.println( 请输入用户名: String userName = sc.nextLine();
 System.out.println( 请输入密码: String password = sc.nextLine();
 String sql =  select * from users where username =   + userName +   and password =   + password +  // 打印出 SQL
 System.out.println(sql);
 ResultSet resultSet = smt.executeQuery(sql);
 if(resultSet.next()){
 System.out.println( 登录成功!!! }else{
 System.out.println( 用户名或密码错误,请重新输入!!! }
 resultSet.close();
 smt.close();
 conn.close();
 }
}

1.3 正常登录

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

SQL 注入怎么解决

1.4 登录失败

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

SQL 注入怎么解决

1.5 模拟 SQL 注入

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

SQL 注入怎么解决

1.6 SQL 语法报错

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

SQL 注入怎么解决

2. 解决方案

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

2.1 程序

import java.sql.*;
import java.util.Scanner;
public class TestSQLIn { public static void main(String[] args) throws ClassNotFoundException, SQLException {
 Class.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(conn);
 //  获取语句执行平台对象  Statement
 // Statement smt = conn.createStatement();
 Scanner sc = new Scanner(System.in);
 System.out.println( 请输入用户名: String userName = sc.nextLine();
 System.out.println( 请输入密码: String password = sc.nextLine();
 String sql =  select * from users where username = ? and password = ?  
 // System.out.println(sql);
 // ResultSet resultSet = smt.executeQuery(sql);
 PreparedStatement preparedStatement = conn.prepareStatement(sql);
 preparedStatement.setString(1,userName);
 preparedStatement.setString(2,password);
 ResultSet resultSet = preparedStatement.executeQuery();
 if(resultSet.next()){
 System.out.println( 登录成功!!! }else{
 System.out.println( 用户名或密码错误,请重新输入!!! }

}

2.2 正常登录

SQL 注入怎么解决

2.3 用户名密码错误

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

SQL 注入怎么解决

2.4 模拟 SQL 注入

按照之前的情况,进行 SQL 注入的写法,测试后不再出现 SQL 注入情况。

SQL 注入怎么解决

2.5 模拟 SQL 语法错误

使用预处理类后,输入带有单引号或双引号的内容也不会再出现 SQL 语法错误的报错

SQL 注入怎么解决

3. 小结

Statement 与 PreparedStatement 的主要区别如下:

Statement 用于执行静态 SQL 语句,在执行时,必须指定一个事先准备好的 SQL 语句

PrepareStatement 是预编译的 SQL 语句对象,语句中可以包含动态参数“?”,在执行时可以为“?”动态设置参数值

PrepareStatement 可以减少编译次数提高数据库性能

以上是“SQL 注入怎么解决”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计3313字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 有没有毛片网站 | 欧美日韩国产综合在线 | 亚洲综合在线成人一区 | 免费人成在线观看 | 私啪影院 | 久久www免费人成精品 | 香蕉精品在线 | 一级女性黄 色生活片 | 欧美在线中文字幕 | 亚欧色视频在线观看免费 | 欧美日韩1区2区 | 精品在线一区二区三区 | 日日日日人人人夜夜夜2017 | 久草在线在线精品观看 | 九九色影院 | 毛片高清视频在线看免费观看 | 影音先锋男人站 | 人妻体内射精一区二区 | 好屌爽在线视频 | 无码专区天天躁天天躁在线 | 欧美日韩不卡视频合集 | 艳妇臀荡乳欲伦交换在线播放 | 91福利在线免费观看 | 精品99久久 | 香蕉免费一区二区三区 | 亚洲国产一区二区三区最新 | 嫩草伊人久久精品少妇av | 日韩亚洲一区中文字幕 | 日韩欧美亚洲一区精选 | 免费精品国产 | 三级视频在线播放 | 日日日操操操 | 国产成人精品视频免费大全 | 久久国产精品99国产精 | 一区二区在线免费观看 | 亚洲成人性视频 | 亚洲处破女av日韩精品 | 69久久精品无码一区二区 | 99精品人妻无码专区在线视频区 | 国内精品久久久久伊人av | 午夜网站在线观看免费网址免费 |