SQL注入的场景复现和解决方案

文章目录

  • 一、前言
    • SQL注入是什么?
  • 二、解决方案
    • 如何避免SQL注入?
  • 三、案例说明
    • 1、案例来源:黑马程序员
    • 2、SQL注入演示
            • 1.创建应该新的数据库用于测试;
            • 2.修改配置
            • 3.启动jar包
            • 4.打开网页测试
            • 5.测试sql注入
    • 3、解决SQL注入方案
            • 1\. java中的登录逻辑代码
            • 2.演示sql注入
            • 3.原因
            • 5.参数化查询-PreparedStatement
  • 四、声明

一、前言

SQL注入是什么?

SQL 注入(SQL Injection)是一种常见的网络攻击技术,它利用应用程序没有正确过滤用户输入的数据,将恶意的 SQL 代码注入到应用程序中执行,从而导致应用程序的安全性受到威胁。

  • 通简单来说,就是通过构造恶意的 SQL 语句,将恶意代码注入到应用程序中执行,从而实现各种攻击手段。

二、解决方案

如何避免SQL注入?

应用程序需要对用户输入的数据进行正确的验证和过滤!
方法:

  • 使用参数化查询:应用程序应该使用参数化查询来执行 SQL 语句,而不是拼接字符串的方式。参数化查询可以将用户输入的数据视为参数,而不是 SQL 语句的一部分,从而避免 SQL 注入攻击。在 Java 中,可以使用 PreparedStatement 类来执行参数化查询。
  • 过滤用户输入:应用程序可以对用户输入的数据进行过滤和验证,例如检查用户输入是否符合预期格式、是否包含特殊字符等。
  • 最小化权限:应用程序应该尽可能地限制数据库用户的权限,避免恶意用户通过注入恶意代码获取高权限访问数据库。
  • 定期更新:应用程序应该定期更新依赖的库和组件,以及操作系统和数据库等基础设施,避免被已知的漏洞攻击。

三、案例说明

1、案例来源:黑马程序员

2、SQL注入演示

1.创建应该新的数据库用于测试;
mysql> create database test_sqlInject;
Query OK, 1 row affected (0.00 sec)` 
2.修改配置

3.启动jar包

sift+右键(打开powerShell)
运行代码

4.打开网页测试

查看原始的数据表

5.测试sql注入

3、解决SQL注入方案

1. java中的登录逻辑代码
package src.com.itheima.jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;public class SqlUserLogin {public static void main(String[] args) throws Exception {//1.注册驱动Class.forName("com.mysql.jdbc.Driver");//2.获取连接Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "123456");//接受用户输入的用户名和密码String name = "zhangsan";String pwd = "123";//编写sql语句String sql = "SELECT * FROM user where username='"+name+"' AND password = '"+pwd+"' ";//执行sqlStatement stat = conn.createStatement();ResultSet rs = stat.executeQuery(sql);//判断登录是否成功if(rs.next()){System.out.println("登录成功");}else {System.out.println("登录失败");}//释放资源rs.close();stat.close();conn.close();}
}

输入正确的用户名和密码=登录成功

错误则失败

2.演示sql注入

3.原因

通过一段字符串(伪造的sql代码)与真的代码进行拼接使整个 SQL语句的条件判断永远为真,从而绕过了应用程序的身份验证机制,获取了用户的数据。
-概括:拼字符串导致分不清参数和执行的关键字!!!

5.参数化查询-PreparedStatement

PreparedStatement接口

  • PreparedStatement 接口可以用于执行预编译的 SQL语句,并支持参数化查询,可以有效防止 SQL 注入攻击,提高数据库操作的性能和安全性。

使用步骤:

  1. 获取preparedStatement对象
  2. 设置参数值
  3. 执行sql
package src.com.itheima.jdbc;import java.sql.*;
import java.util.ArrayList;public class SqlUserLogin {public static void main(String[] args) throws Exception {//1.注册驱动Class.forName("com.mysql.jdbc.Driver");//2.获取连接Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "123456");//接受用户输入的用户名和密码String name = "bundc";String pwd = "' or '1'='1 ";//编写sql语句String sql = "SELECT * FROM user where username= ? AND password = ? ";//获取prepareStatementPreparedStatement ppst = conn.prepareStatement(sql);//设置展位符?的值ppst.setString(1,name);ppst.setString(2,pwd);//执行sqlResultSet rs = ppst.executeQuery();//判断登录是否成功if(rs.next()){System.out.println("登录成功");}else {System.out.println("登录失败");}//释放资源rs.close();ppst.close();conn.close();}
}

四、声明

  1. 案例提供方:黑马程序员
  2. 原文地址:https://blog.csdn.net/meini32/article/details/132046575

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCASCADE开发指南<三>:OCC 基础类概述

1、OCC 基础类概述 基础类包括根类组件、 串类组件、 集合容器组件、 标准对象的集合容器组件、向量和矩阵类组件、 基本几何类型组件、 常用数学算法组件、 异常类组件、 数量类组件和应用程序服务组件。 1 根类组件 根类是基本的数据类型和类, 其它所有类都是依此…

vue中如何查看组件有哪些函数与变量

在开发的过程中,经常用到他人的框架,特别是开源框架比如element,uniapp等。其中就涉及到框架里对应的组件。而组件里又有哪些内置的函数,我们通常是去查官方文档。然后很多的时候需求的多样性,要改的地方也是不一样的,…

C#构造函数

C#中的构造函数是一种特殊的方法,用于创建和初始化类的对象。构造函数的名称与类的名称相同,并且没有返回类型。 在C#中,构造函数有以下几种类型: 默认构造函数:如果在类中没有定义构造函数,系统将自动提供…

写给新手的单元测试框架unittest运行的简单问题

当使用unittest框架编写和运行单元测试时,需要遵循以下步骤: 1、导入unittest模块:在代码中首先导入unittest模块。 import unittest 2、创建测试类:创建一个继承自unittest.TestCase的测试类。该类将包含一系列测试方法。 clas…

rancher里的ingress如何配置gzip压缩

方案一,未试验成功,但配置过程值得记录一下 通过配置configmap,然后在ingress的deployment里引用configmap实现。 参考文章 创建configmap apiVersion: v1 kind: ConfigMap metadata:name: nginx-ingress-controllerannotations:{} # k…

怎样提高服务器在网络里的安全性?

在互联网行业中,网络安全是已经必须要重视的一点。不管是哪个行业,一旦不小心,自己经营多年的成果可能就因为安全这个问题。付之东流,用户在通过服务器平台搭建的网络环境中要实时的留意自己的安全问题。 更新和维护操作系统和软件…

C语言学习--pow函数和

1.首先使用pow函数必须要加头文件 : #include<math.h> double pow(double x, double y); pow() 函数用来求 x 的 y 次幂&#xff08;次方&#xff09;&#xff0c;x、y及函数值实际上为double型 注意&#xff0c;在某些特定的情况之下&#xff0c;pow函数的double类型…

如何在群晖NAS部署WPS容器并实现无公网IP远程访问本地office软件

文章目录 1. 拉取WPS Office镜像2. 运行WPS Office镜像容器3. 本地访问WPS Office4. 群晖安装Cpolar5. 配置WPS Office远程地址6. 远程访问WPS Office小结 7. 固定公网地址 wps-office是一个在Linux服务器上部署WPS Office的镜像。它基于WPS Office的Linux版本&#xff0c;通过…

若依上传文件/common/upload踩坑

前言&#xff1a;作者用的mac系统&#xff08;这个是个坑&#xff09;&#xff0c;前端用的uniapp&#xff0c;调用若依通用上传方法报错NoSuchFileException: /home/ruoyi/uploadPath/upload... 前端上传代码示例如下: uni.chooseImage({count: 1,success(res){ uni.uploa…

【Python】科研代码学习:十 evaluate (metrics,Evaluator)

【Python】科研代码学习&#xff1a;十 evaluate Evaluate评估类型简单使用教程如何寻找想要的 metric使用 Evaluator与 transformers.trainer 配合使用疑问与下节预告 Evaluate 【HF官网-Doc-Evaluate&#xff1a;API】 看名字就可以知道&#xff0c;Evaluate 是 HF 提供的便…

3.13

微机原理 B C D 可屏蔽中断 串操作方向 将补码取反转换成源码 源码转换成真值 -9 控制 BHE ALE 00100100 24H 02H&#xff0c;05H 波特率 基址相对寻址 00040H 6A910H IP低 IP高 CS低 CS高 68H&#xff1a;50H&#xff1a;24H:10H 68500 2410H 6A910H 存放中断类型…

Igraph入门指南 6

3、make_系列&#xff1a;igraph的建图工具 按照定义&#xff0c;正则图是指各顶点的度均相同的无向简单图&#xff0c;因为我目前没有找到描述度相等的有向&#xff08;或自环图&#xff09;的标准名称&#xff0c;所以在本文中借用一下这个概念&#xff0c;并加上定语有向无…