SQL注入问题

一、什么是sql注入

public class TestSql {public static void main(String[] args) {Scanner inScanner = new Scanner(System.in);System.out.println("请输入用户名");String username = inScanner.nextLine();System.out.println("请输入密码");String password = inScanner.nextLine();String sql = "select * from user where username = '"+username+"' and password = '"+password+"'";search(sql);}public static void search(String sql) {try {Class.forName("com.mysql.jdbc.Driver"); // 1.加载驱动//2.建立连接Connection connection = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/login?useUnicode=true&characterEncoding=utf-8", "root", "");//3.创建执行的SQL语句Statement statement = (Statement) connection.createStatement();//4.执行sql语句ResultSet re = (ResultSet) statement.executeQuery(sql);//5.处理结果if(re.next()) {System.out.println("查询成功...");}else {System.out.println("查询失败...");}//6.释放资源if(re!=null) {re.close();}if(statement !=null) {statement.close();}if (connection !=null) {connection.close();}} catch (Exception e) {// TODO Auto-generated catch blockSystem.out.println("找不到驱动类,加载失败");e.printStackTrace();} }}

以上的程序我们经过测试没什么问题,但是当输入如下数据的时候,一个可怕的问题出现了。

 

数据库中只有一个数据

那么为什么会产生这个现象呢?

我们将拼接好的sql语句拿出来

select * from user where username =' 111' and password = '1' or '1'='1';

我们将SQL语句拿到Navicat运行一下 

        这种通过传参就能改变SQL语句原本规则的操作就是SQL注入,这个在实际开发中当然是危险的,攻击者可以把SQL命令插入到Web表单的输入域或页面请求的查询字符串中,欺骗服务器执行恶意的SQL命令。

二、为什么会产生sql注入问题呢?

        我们可以把sql语句的执行流程大致分为一下几个步骤:

1.本地sql语句拼接

2.发送sql语句给DBMS

3.DBMS进行sql编译

        造成sql注入的原因在于我们在本地拼接了一条“有安全隐患的”sql语句。之后我们将拼接好的sql语句发送给DBMS,DBMS将“有安全隐患”的sql语句进行了编译执行。

这里的重点是:用户的信息参与到了编译过程,而这个信息出现了问题

三、如何解决sql注入问题呢?

        其实解决方法很简单:只要用户提供的信息不参与SQL语句的编译过程,问题就解决了。

要想让用户的信息不参与SQL语句的编译,那么就需要预先对sql语句的框架进行编译,然后再给给sql赋值。预编译完成之后我们的DBMS只需要执行我们的sql语句,没必要再次编译。可以使用java.sql.PreparedStatement接口完成预编译,PreparedStatement是属于预编译的数据库操作对象

使用PreparedStatement需要注意的几点

①:占位符

String sql = "select * from user where username = ? and password = ?";

我们拼写好的sql语句不在使用直接拼接赋值的方式,而是采用 ? 占位符进行代替

②:创建方式

statement.setString(1, usernanme);
statement.setString(2, password);

总体代码如下

public class TestSql {public static void main(String[] args) {Scanner inScanner = new Scanner(System.in);System.out.println("请输入用户名");String username = inScanner.nextLine();System.out.println("请输入密码");String password = inScanner.nextLine();String sql = "select * from user where username = ? and password = ?";search(sql,username,password);}public static void search(String sql,String usernanme,String password) {try {Class.forName("com.mysql.jdbc.Driver"); // 1.加载驱动//2.建立连接Connection connection = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/login?useUnicode=true&characterEncoding=utf-8", "root", "2020");//3.创建执行的SQL语句PreparedStatement statement = (PreparedStatement) connection.prepareStatement(sql);// 给占位符赋值statement.setString(1, usernanme);statement.setString(2, password);//4.执行sql语句ResultSet re = (ResultSet) statement.executeQuery();//5.处理结果if(re.next()) {System.out.println("查询成功...");}else {System.out.println("查询失败...");}//6.释放资源if(re!=null) {re.close();}if(statement !=null) {statement.close();}if (connection !=null) {connection.close();}} catch (Exception e) {// TODO Auto-generated catch blockSystem.out.println("找不到驱动类,加载失败");e.printStackTrace();} }}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3246102.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

安卓笔记1-Retrofit2请求自定义接口

1、整体功能概述 安卓项目中使用Retrofit2实现和自定义接口的网络交互,通过Postman模拟服务端,创建自定义接口。 作用 前后端开发进度对不齐时,客户端可利用本功能模拟测试数据。备忘。 缺点 retrofit模拟接口需要配置响应数据类&#xff…

2024网络准入控制系统排行|好用的网络准入系统有哪些?

随着数字化转型的深化及网络安全威胁的日益复杂,网络准入控制系统(NAC)已成为企业安全架构中不可或缺的一部分。NAC系统通过对接入网络的设备进行身份验证、安全检测和策略实施,确保仅允许符合安全标准的设备连接至网络&#xff0…

QT上位机绘制一个表格显示MYSQL数据库(六)

一. QT制作MYSQL表格 database.cpp #include "database.h" #include "ui_database.h"#include <QMessageBox> #include <QDebug> #include <QSqlError>database::database(QWidget *parent) :QWidget(parent),ui(new Ui::database) {u…

【ollama】ollama运行GLM4-9B和CodeGeeX4-ALL-9B

一、下载GGUF模型 glm-4-9b-chat-GGUFcodegeex4-all-9b-GGUF 使用modelscope下载 先安装 pip install modelscope 命令1 modelscope download --modelLLM-Research/glm-4-9b-chat-GGUF --local_dir . glm-4-9b-chat.Q5_K.gguf命令2 modelscope download --modelLLM-Researc…

条件匹配工具之ACL概述

基本概念 ACL&#xff0c;即Access Control List&#xff08;访问控制列表&#xff09;&#xff0c;每个ACL但是是由单条或多条Rule&#xff08;规则&#xff09;组成的一个集合 技术背景&#xff1a; 1.用户需求&#xff1a; 用户对网络服务体验的要求越来越高&#xff0c…

学习测试9-接口测试 3-jmeter

jmeter启动 测试计划 1 创建线程组 2 创建http请求 数据类型 from表单数据可以通过剪切板直接粘贴 JSON数据需要从括号开始复制 3 查看结果树 4 http cookie管理器&#xff0c;可以记住登录状态 内部不用设置 5 断言 系统返回的信息进行判断 系统返回“新增会议信息成功” …

python--实验13 异常处理

目录 知识点 异常概述 异常类 异常处理 捕获简单异常 原理 示例 异常处理except 原理及代码格式 try工作原理 标记程序上下文&#xff0c;异常发生时跳转 代码示例 终止行为finally 抛出异常raise 原理 代码格式 示例 自定义异常 原理 示例 断言assert 判…

爱因斯坦:常识就是人到十八岁为止所累积的各种偏见!——早读(逆天打工人爬取热门微信文章解读)

时间过得好快&#xff0c;2023下半年要为了自己的年终终结立下的flag奋斗了&#xff01; 引言Python 代码第一篇 洞见 所有关系的痛苦&#xff0c;都来自“鸡同鸭讲”第二篇结尾 引言 最近应该写的时间会比较晚 因为要看会盘 然后确定一下今天是否有参与的机会 从星期一到现在…

数据预处理在建模中的重要性与常见方法(一):数据清洗篇

一、引言 数据预处理的重要性 数据预处理是数据科学和机器学习中至关重要的一步。高质量的数据预处理可以有效去除噪声、修复缺失值、处理异常值&#xff0c;确保后续分析和模型构建的准确性和可靠性。未经过良好预处理的数据可能导致模型性能下降和错误结论。 数据预处理的…

vue自制表格

一、有时候element-ui的表格不满足需求&#xff0c;需要自定义表格&#xff0c;例如图下 二、上代码 <table class"tablenew table1" cellpadding"0" cellspacing"0"><tr><td>身份证号码</td><td>111111111</…

每日一题,力扣leetcode Hot100之49. 字母异位词分组

该题用哈希表解答&#xff0c;具有统一特征的作为哈希表的键名&#xff0c;然后满足要求的作为值 解法一&#xff1a; 我们将每个字符串进行排序&#xff0c;如果排序后的结果相同&#xff0c;则可以认为是字母异位词&#xff0c;我们将排序后的结果作为哈希表的key&#xff…

java通过jwt生成Token

定义 JWT&#xff08;JSON Web Token&#xff09;简而言之&#xff0c;JWT是一个加密的字符串&#xff0c;JWT传输的信息经过了数字签名&#xff0c;因此传输的信息可以被验证和信任。一般被用来在身份提供者和服务提供者间传递被认证用户的身份信息&#xff0c;以便于从资源服…

[MySQL][内置函数][日期函数][字符串函数][数学函数]详细讲解

目录 1.日期函数1.基础语法2.示例13.示例2 2.字符串函数1.基础语法2.示例 3.数学函数1.基础语法2.示例 4.其他函数 1.日期函数 1.基础语法 日期时间在MYSQL中是区分开的 日期&#xff1a;年月日时间&#xff1a;时分秒 获得年月日select current_date();----------------| cur…

新版网页无插件H.265播放器EasyPlayer.js如何测试demo视频?

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff1b;支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#xff0…

【爬虫】滑块缺口识别

滑块示例 分为背景图 和 滑块图 主要目的 识别背景图滑块缺口 下载识别库 pip install opencvcode import numpy as np import cv2def identify_gap(bg, tp):bg1 np.asarray(bytearray(bg), dtypenp.uint8)tp1 np.asarray(bytearray(tp), dtypenp.uint8)# 灰度bg_img cv2…

磁盘分区教程图文

磁盘分区是计算机存储管理中的一项重要操作&#xff0c;它不仅能帮助我们更好地组织和管理数据&#xff0c;还能提高系统的性能和安全性。无论是新手还是有经验的用户&#xff0c;了解和掌握磁盘分区的基本知识都是十分必要的。本篇科普文章旨在为初学者提供一个简单易懂且全面…

汽车免拆诊断案例 | 卡罗拉急加速抖动故障排除

车型信息 2017年改款卡罗拉&#xff0c;排量1.2T&#xff0c;行驶里程48800公里。 故障现象 车辆不管在什么状态下&#xff0c;只要是平缓加速&#xff0c;都不会有抖动。车辆静止时&#xff0c;急加速时&#xff0c;也不会有抖动。但是车速达40公里/小时以上&#xff0c;急加…

sping总览

一、spring体系 1. spring是什么&#xff1f; 轻量级的开源的J2EE框架。它是一个容器框架&#xff0c;主要实现了ioc&#xff0c;同时又通过aop实现了面向切面编程&#xff0c;它又是一个中间层框架&#xff08;万能胶&#xff09;可以起一个连接作用&#xff0c;比如说把myba…

数据恢复:WD My Cloud Home NAS 及其卷的特点

天津鸿萌科贸发展有限公司是西部数据 WD 存储产品的授权代理商&#xff0c;是 UFS Explorer Professional Recovery 数据恢复软件的授权代理商。 如今&#xff0c;几乎每个人都有大量的数字文件&#xff0c;他们希望保持安全&#xff0c;最好总是触手可及。为此&#xff0c;有些…

华为云.VPC关联概念与对等连接实践

云计算.华为云 VPC关联概念与对等连接实践 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/q…