JAVA- SQL注入案例(黑马程序员)和避免 超级详细

文章目录

      • sql注入准备
          • 1.创建应该新的数据库用于测试;
          • 2.修改配置
          • 3.启动jar包
          • 4.打开网页测试
          • 5.测试sql注入
      • sql注入避免
          • 1. java中的登录逻辑代码
          • 2.演示sql注入
          • 3.原因
          • 5.参数化查询-PreparedStatement

SQL注入是什么?

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

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

如何避免SQL注入?

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

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

案例来源:黑马程序员
在这里插入图片描述

sql注入准备

来源:黑马程序员

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

在这里插入图片描述

3.启动jar包

sift+右键(打开powerShell)
运行代码
在这里插入图片描述

4.打开网页测试

在这里插入图片描述
查看原始的数据表
在这里插入图片描述

5.测试sql注入

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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();}
}

在这里插入图片描述

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

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

相关文章

Kubernetes系列

文章目录 1 详解docker,踏入容器大门1.1 引言1.2 初始docker1.3 docker安装1.4 docker 卸载1.5 docker 核心概念和底层原理1.5.1 核心概念1.5.2 docker底层原理 1.6 细说docker镜像1.6.1 镜像的常用命令 1.7 docker 容器1.8 docker 容器数据卷1.8.1 直接命令添加1.8.2 Dockerfi…

cocosCreator 之 2D物理

版本: v3.4.0 简介 cocosCreator 内置了 2D 物理系统 和 3D 物理系统,开发者可以通过项目 -> 项目设置 -> 功能裁切来配置物理系统相关: 本文仅对2D 物理系统 做下说明和遇到的问题汇总。该物理系统在cocosCreator的功能裁切中&#x…

android 如何分析应用的内存(十三)——perfetto

android 如何分析应用的内存(十三) 本篇文章是native内存的最后一篇文章——perfetto perfetto简介 从2018年始,android开发者峰会正式推出perfetto工具。从此perfetto成为安卓最重要的工具之一。在2018年以前,android使用syst…

微信小程序tab加列表demo

一、效果 代码复制即可使用,记得把图标替换成个人工程项目图片。 微信小程序开发经常会遇到各种各样的页面组合,本demo为list列表与tab组合,代码如下: 二、json代码 {"usingComponents": {},"navigationStyle&q…

matlab使用教程(6)—线性方程组的求解

进行科学计算时,最重要的一个问题是对联立线性方程组求解。在矩阵表示法中,常见问题采用以下形式:给定两个矩阵 A 和 b,是否存在一个唯一矩阵 x 使 Ax b 或 xA b? 考虑一维示例具有指导意义。例如,方程 …

20.3 HTML 表格

1. table表格 table标签是HTML中用来创建表格的元素. table标签通常包含以下子标签: - th标签: 表示表格的表头单元格(table header), 用于描述列的标题. - tr标签: 表示表格的行(table row). - td标签: 表示表格的单元格(table data), 通常位于tr标签内, 用于放置单元格中的…

奥迪A3:最新款奥迪A3内饰设计及智能科技应用

奥迪A3一直以来都是奥迪的入门级车型,但这并不意味着它在科技和内饰方面会有所退步。最新款奥迪A3的内饰设计和智能科技应用让人们再次惊叹奥迪的创新能力。 内饰设计 奥迪A3最新款的内饰设计引入了奥迪最新的设计元素,比如8.8英寸的中控显示屏&#xf…

干货 ,ChatGPT 4.0插件Review Reader,秒杀一切选品神器

Hi! 大家好,我是专注于AI项目实战的赤辰,今天继续跟大家介绍另外一款GPT4.0插件Review Reader(评论阅读器)。 做电商领域的小伙伴们,都知道选品分析至关重要,可以说选品决定成败,它直接关系到产…

【深度学习】High-Resolution Image Synthesis with Latent Diffusion Models,论文

13 Apr 2022 论文:https://arxiv.org/abs/2112.10752 代码:https://github.com/CompVis/latent-diffusion 文章目录 PS基本概念运作原理 AbstractIntroductionRelated WorkMethodPerceptual Image CompressionLatent Diffusion Models Conditioning Mec…

申请软件著作权都有什么好处?

随着社会的发展,知识产权保护意识对于公司而言尤为重要,对自己的权利进行最大限度的保护,以防止被别有用心的人侵权。那么,申请软著的好处到底是什么?软著有什么用呢? 无形资产软著是一种无形的知识产权,是开发者智慧…

Spark-对RDD的理解

RDD是分布式弹性数据集。 RDD有五大特性: 一组分区,每个RDD都会被分为多个分区,这些分区运行在集群的不同节点上,分区数决定并行计算的数量。一个计算每个分区的函数,就是计算逻辑。RDD之间的依赖关系,就…

大数据技术之Clickhouse---入门篇---数据类型、表引擎

星光下的赶路人star的个人主页 今天没有开始的事,明天绝对不会完成 文章目录 1、数据类型1.1 整型1.2 浮点型1.3 布尔型1.4 Decimal型1.5 字符串1.6 枚举类型1.7 时间类型1.8 数组 2、表引擎2.1 表引擎的使用2.2 TinyLog2.3 Memory2.4 MergeTree2.4.1 Partition by分…

简单分享婚宴预订小程序怎么做

婚宴预订小程序需要具备一些功能,通过这些功能,新人可以更方便地选择婚宴场地、预订服务,并且更好地规划自己的婚礼。 1. 场地浏览与选择 婚宴预订小程序可以展示多个婚宴场地的照片和详细信息,包括容纳人数、场地设施、价格等。…

无涯教程-Lua - Arrays(数组)

数组是对象的有序排列,可以是包含行集合的一维数组,也可以是包含多行和多列的多维数组。 在Lua中,数组是使用带有整数的索引表实现的。数组的大小不是固定的,并且可以根据无涯教程的要求(取决于内存限制)来增长。 一维数组 一维…

8.1作业

文件IO函数实现拷贝文件。子进程先拷贝后半部分&#xff0c;父进程再拷贝前半部分&#xff0c;允许使用sleep函数 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<head.h> int main(int argc, const char *argv[]) {pid_t cpidfo…

指针初阶(1)

文章目录 目录1. 指针是什么2. 指针变量的类型2.1 指针变量-整数2.2 指针变量的解引用 3. 野指针3.1 野指针成因3.2 如何规避野指针 4. 指针运算4.1 指针-整数4.2 指针-指针4.3 指针的关系运算 附&#xff1a; 目录 指针是什么指针变量的类型野指针指针运算指针和数组二级指针…

面试总结(三)

1.进程和线程的区别 根本区别&#xff1a;进程是操作系统分配资源的最小单位&#xff1b;线程是CPU调度的最小单位所属关系&#xff1a;一个进程包含了多个线程&#xff0c;至少拥有一个主线程&#xff1b;线程所属于进程开销不同&#xff1a;进程的创建&#xff0c;销毁&…

【Vue组件eval方法的使用】

Vue页面中条件可以放在当前vue页面中而无需影响到组件 如 这是我的表格操作列按钮&#xff0c;需求是第四个按钮如果表格当前数据的is_execl字段为0则显示否则隐藏 这种条件判断很频繁 如果像之前一样给一个标识&#xff0c;页面多了就难以维护&#xff0c;而且判断条件如果不…

【硬件设计】模拟电子基础一--元器件介绍

模拟电子基础一--元器件介绍 一、半导体&#xff08;了解&#xff09;1.1 基础知识1.2 PN结 二、二级管2.1 定义与特性2.2 二极管的分类 三、三级管四、MOS管三、其他元器件管3.1 电容3.2 光耦3.3 发声器件3.4 继电器3.5 瞬态电压抑制器 前言&#xff1a;本章为知识的简单复习&…

【Spring框架】SpringBoot创建和使用

目录 什么是SpringBoot&#xff1f;SpringBoot优点创建SpringBootSpringBoot使用 什么是SpringBoot&#xff1f; Spring 的诞⽣是为了简化 Java 程序的开发的&#xff0c;⽽ Spring Boot 的诞⽣是为了简化 Spring 程序开发的。 SpringBoot优点 1.起步依赖(创建的时候就可以方…