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…

RVM问题记录 - Error running ‘__rvm_make -j10‘

文章目录 前言开发环境问题描述问题分析解决方案最后 前言 公司新到一台电脑需要配置开发环境,在用RVM安装Ruby时遇到了一个奇怪的问题。 开发环境 RVM: 1.29.12OpenSSL: 3.1.1 问题描述 执行命令安装Ruby 3.0版本: rvm install ruby-3.0.0在编译阶…

额外题目第3天|1382 100 116 52 649 1221 5

1382 用迭代遍历把1382又做了一遍 中序遍历树再记一遍 这次的中序遍历总结:重点在curr不是每次pop的时候更新 而是要作为一个全局变量记录 while里面都用if else 不要再用while 容易出现的bug是 在左节点遍历完之后,在vec加入中节点时又去判断左节点的…

kubernetes之NetworkPolicy

一、背景 如果希望在OSI模型中第三层或第四层控制网络流量,则应该使用NetworkPolicy这个对象;NetworkPolicy以应用为中心,主要用来控制Pod网络流量的进入和流出 二、实例说明 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadat…

cocosCreator 之 2D物理

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

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

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

二分查找P1873 [COCI2011-2012#5] EKO / 砍树

P1873 [COCI2011-2012#5] EKO / 砍树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这个题就是给新手练手的&#xff0c;在那个位置上在进行&#xff0c;寻找合适的砍树高度&#xff0c;下面在介绍一个二分查找的模板 int binarySearch(vector<int>& nums, int t…

微信小程序tab加列表demo

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

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

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

20.3 HTML 表格

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

MVC乱码问题

RequestMapping(value "insert",produces {"text/html;charsetutf-8"}) //前端响应回去加响应头&#xff0c;解决乱码问题,这个还跟JSP响应头还不一样&#xff0c;这是响应的字符串&#xff0c;纯文本&#xff0c;那个前端的是out.Writer()对象&#xff…

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

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

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

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

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

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

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

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

Spark-对RDD的理解

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

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

星光下的赶路人star的个人主页 今天没有开始的事&#xff0c;明天绝对不会完成 文章目录 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分…

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

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

海外团队和国内团队如何使用 J2L3x 进行沟通协作

在人员分布不同地区或不同国家的情况下&#xff0c;如何进行高效的沟通和协作成为一个重要的问题。J2L3x 是一款专门为团队沟通协作而设计的工具&#xff0c;提供实时消息、语音通话、文件共享、任务管理等多种功能&#xff0c;特别适合海外团队和国内团队的协作。在本文中&…

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

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