SQL注入攻击

1.用java实现登录的检查

package jdbc1;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;public class Login {public static void main(String args[]){try(Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306","root","020809");Statement statement=connection.createStatement();Scanner scanner=new Scanner(System.in);){ResultSet resultSet = statement.executeQuery("select * from accounting_ledger.user where username='"+scanner.nextLine()+"'and password='"+scanner.nextLine()+"';");while(resultSet.next()){String name = resultSet.getString(1);System.out.println(name+"login successfully!");}}catch(Exception e){e.printStackTrace();}}
}

2.注入攻击

看似没有问题,可是如果我输入的如果是以下内容呢?

Test
1111' or 1=1; -- 

这是因为我们实际运行的sql语句变成了

select * from user where username='Test' and pwd='1111' or 1=1; -- '

而1=1一定是对的,所以这个语句一定是正确的。我们发现,如果允许这样的数据插入,那么我们原有的SQL语句结构就遭到了破坏,使得用户能够随意登陆别人的账号。因此我们可能需要限制用户的输入来防止用户输入一些SQL语句关键字,但是关键字非常多,这并不是解决问题的最好办法。

PreparedStatement

package jdbc1;import java.sql.*;
import java.util.Scanner;public class safeLogin {public static void main(String args[]){try(Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306","root","020809");PreparedStatement statement = connection.prepareStatement("select * from user where username= ? and password=?;");Scanner scanner=new Scanner(System.in)){statement.setString(1, scanner.nextLine());statement.setString(2, scanner.nextLine());System.out.println(statement);    //打印查看一下最终执行的ResultSet resultSet = statement.executeQuery();while(resultSet.next()){String name = resultSet.getString(1);System.out.println(name+"login successfully!");}}catch(Exception e){e.printStackTrace();}}
}

我们发现,我们需要提前给到PreparedStatement一个SQL语句,并且使用?作为占位符,它会预编译一个SQL语句,通过直接将我们的内容进行替换的方式来填写数据。

而setString方法则会将读取的输入填入占位符的位置。第一个参数是传入的位置,第二个参数是传入的内容。

使用这种方式,我们之前的例子就失效了!我们来看看实际执行的SQL语句是什么: 

com.mysql.cj.jdbc.ClientPreparedStatement: select * from user where username= 'Test' and pwd='123456'' or 1=1; -- ';

我们发现,我们输入的参数一旦出现'时,会被变为转义形式\',而最外层有一个真正的'来将我们输入的内容进行包裹,因此它能够有效地防止SQL注入攻击! 

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

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

相关文章

Redis管道操作

文章目录 1. 问题提出2. 解决方案3. 案例演示4. 总结 1. 问题提出 如何优化频繁命令往返造成的性能瓶颈? Redis是一种基于C/S一级请求响应协议的TCP服务,一个请求会遵循一下步骤: 客户端向服务端发送命令分四步(发送命令-> …

教程视频二维码怎么做?扫码学习使用技巧

现在购买商品时经常会发现使用手册或者包装上会印有相关的二维码,扫码可以查看产品介绍或者使用说明的视频教学。将需要展示的内容放到二维码中,让用户能够通过扫码了解内容详情,有效的降低成本而且方便用户获取内容。 那么如果想要制作视频…

中科星图——Landsat9_C2_SR大气校正后的地表反射率数据

数据名称: Landsat9_C2_SR 数据来源: USGS 时空范围: 2022年1月-2023年3月 空间范围: 全国 数据简介: Landsat9_C2_SR数据集是经大气校正后的地表反射率数据,属于Collection2的二级数据产品&#…

linux |离线安装软件 | rpm命令

离线 安装包管理命令 rpm ##### #检查安装包是否认证成功 简单讲 来源是否可靠 rpm --checksig xxx.rpmrpm --checksig nmap-7.92-1.x86_64.rpm nmap-7.92-1.x86_64.rpm: sha1 md5 OK#### 安装前检验包的依赖库 rpm -qpR nmap-7.92-1.x86_64.rpm python > 2.4 rpmlib(Fil…

128基于matlab的粒子群优化算法寻找多元函数的最大值

基于matlab的粒子群优化算法寻找多元函数的最大值,可定义多元函数,变量区间范围,输出最大值条件下的变量值。程序已调通,可直接运行。 128matlab多元函数极值 (xiaohongshu.com)

Sectigo有几种泛域名SSL证书买一年送一个月

Sectigo是一家知名的数字证书颁发机构,提供了很多种类型的SSL证书,可以满足不同用户的需求。其中,泛域名SSL证书是一种常见的证书类型,可以同时保护主域名以及主域名下所有子域名。今天就随SSL盾小编了解Sectigo旗下有几种泛域名S…

【origin】负载牵引的Smith圆图

【origin】负载牵引的Smith圆图 1.从ADS导入数据到origin2.smith圆图3.扩展到多组线4.参考资料 1.从ADS导入数据到origin export导出为txt,得到的是幅相值,复制到excel如下图,有多根类似格式的线,只需要复制DE列到origin中 复制到…

腾讯云COS桶文件上传下载工具类

1&#xff0c;申请key和密钥 2&#xff0c;引入依赖 <dependency><groupId>com.qcloud</groupId><artifactId>cos_api</artifactId><version>5.6.24</version></dependency>3&#xff0c;工具类 package com.example.activi…

在qml中,loader创建的组件,此时当loader的souceComponet变了其他组件,那么之前创建的组件还在吗?

在 QML 中&#xff0c;当 Loader 的 sourceComponent 属性变更为其他组件时&#xff0c;之前创建的组件会被销毁。这是因为 Loader 负责加载和卸载不同的组件。 以下是一个简单的例子&#xff0c;演示 Loader 的工作方式&#xff1a; import QtQuick 2.0Rectangle {width: 36…

怎么找微信服务器的IP地址

首先&#xff0c;让微信客户端在PC端运行&#xff0c;在任务管理器->详细信息中&#xff0c;找到WeChat.exe的进程&#xff0c;找到PID 就是微信进程的ID号&#xff0c;如下图所示&#xff1a; 打开一个命令行窗口&#xff0c;cmd或者powershell窗口都可以&#xff0c;输入…

筛选数据-第15届蓝桥第三次STEMA测评Scratch真题精选

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第164讲。 第15届蓝桥杯第3次STEMA测评已于2023年12月17日落下帷幕&#xff0c;编程题一共有6题&#xff0c;分别如下&…

transforms.Compose()函数作用解析

这是一个torchvision.transforms模块的函数&#xff0c;用于将一系列变换组合成一个新的变换序列。它接受一个变换列表&#xff0c;该列表包含一系列的图像处理操作&#xff0c;例如图像随机缩放、裁剪、旋转和翻转等。 在创建变换序列时&#xff0c;可以按照自己需要的顺序添…

大数据之谷歌文件系统论文 GFS The Google File System

原文地址 谷歌文件系统论文 摘要 我们设计并实现了Google文件系统&#xff0c;这是一个面向大规模分布式数据密集型应用的可扩展分布式文件系统。 它在廉价的通用硬件上运行&#xff0c;提供了容错性&#xff0c;并向大量客户端提供高聚合性能。 尽管与先前的分布式文件系统…

2023 我的编程之旅——路人贾‘ω‘

哈喽&#xff01;大家好&#xff0c;我是路人贾&#x1f601;~今天不读论文也不讲算法&#xff0c;来聊点有意思的&#xff01; 这是我第100篇博文&#xff0c;我翻了几遍草稿箱的库存&#xff0c;正纠结选哪篇时&#xff0c;一抬头看见了这个活动&#xff0c;眼前瞬间一亮——…

YOLOv8改进 | 融合改进篇 | CCFM + Dyhead完美融合突破极限涨点 (全网独家首发)

一、本文改进 本文给大家带来的改进机制是CCFM配合Dyhead检测头实现融合涨点,这个结构配合在一起只能说是完美的融合,看过我之前的检测头篇的读者都知道Dyhead官方版本支持的输入通道数是需要保持一致的,但是CCFM作为RT-DETR的Neck结构其输出通道数就是一致的,所以将这两种…

高防服务器、高防 IP 和高防 CDN 之间有什么区别?

网络运营人员最头痛的是什么&#xff1f; 网络攻击无疑名列前茅。一旦企业遭受网络攻击&#xff0c;所面临的损失可能是无法估量的。那么&#xff0c;如何有效地抵御网络攻击呢&#xff1f; 高防 IP、高防 CDN 和高防服务器是当前主流的防御手段。那何为“高防”呢&#xff1…

在qml中,ListModel可以与WorkerScript一起使用,从多个线程访问列表模型

在QML中&#xff0c;您可以使用ListModel和WorkerScript一起实现多线程访问列表模型。以下是一个简单的例子&#xff0c;演示了如何在QML中使用这两个元素&#xff1a; import QtQuick 2.15 import QtQuick.Controls 2.15ApplicationWindow {visible: truewidth: 400height: 3…

【深度学习每日小知识】Overfitting 过拟合

过拟合是机器学习&#xff08;ML&#xff09;中的常见问题&#xff0c;是指模型过于复杂&#xff0c;泛化能力较差的场景。当模型在有限数量的数据上进行训练&#xff0c;并且学习了特定于该特定数据集的模式&#xff0c;而不是适用于新的、看不见的数据的一般模式时&#xff0…

tkinter控件中文显示为unicode编码的解决办法

一、背景 最近使用python tkinter编写界面应用时&#xff0c;发现按钮的中文名称在windows上显示正常&#xff0c;但是在linux上显示为中文的unicode编码&#xff1b;文本输入框也是&#xff0c;输入中文输时&#xff0c;text控件上也显示为unicode编码&#xff0c;如下图所示…

4.4 媒资管理模块 - 分布式任务处理介绍、视频处理技术方案

媒资管理模块 - 视频处理 文章目录 媒资管理模块 - 视频处理一、视频转码1.1 视频转码介绍1.2 FFmpeg 基本使用1.2.1 下载安装配置1.2.2 转码测试 1.3 工具类1.3.1 VideoUtil1.3.2 Mp4VideoUtil1.3.3 测试工具类 二、分布式任务处理2.1 分布式任务调度2.2 XXL-JOB 配置执行器 中…