网络安全系列 之 SQL注入学习总结
1. sql注入概述
程序里面如果使用了未经校验的外部输入来构造SQL语句,就很可能会引入SQL注入漏洞。
注入攻击
对于字符串输入,如果这个字符串将被解释为某种指令,那么需要特别注意防止注入攻击。sql注入、os命令注入、xml注入是典型的攻击类型。
2. sql注入测试工具
可以使用BurpSuite工具,浏览器上修改代理设置为burp工具配置的代理监听的IP端口。
对浏览器发送的请求进行拦截并修改其中参数,尝试注入攻击。
- sleep盲注: 返回时间>=5s,存在注入.
{"stationCodes":"AD02C7CCAB6F4BF9A85BC010AF16AC62')xor(sleep(5))and('","ptIds":"","pmYearDate":"2018","page":1,"pageSize":10} - 普通注入or /and : id="1' or '1'='1" id="1' or '1'='2"
- 报错注入: updatexml /extractvalue 、floor后group by。
- id=1 and updatexml(1,concat(0x7e,version(),0x7e),1) 返回version(),存在注入.
- id=1 and extractvalue(1,concat(0x7e,version()) 返回version(),存在注入.
- id=1 and (select 1 from (select count(),concat(version(),floor(rand(0)2))x from information_schema.tables group by x)a)
返回version(),存在注入.
3. sql注入防御方法
3.1 问题来源
- 执行外部数拼接的SQL语句。
- 执行外部传入的整条SQL语句
- 在配置文件中的SQL语句没有使用预编译方式占位符。
- 校验函数有缺陷或占位符使用错误。
3.2 防御方法
-
使用参数化语句
sql语句预编译绑定变量,不直接拼接。 -
输入校验
采用白名单或黑名单方式对入参进行检查。
备注:ESAPI(Enterprise Security API)也提供了输入验证类 org.owasp.esapi.reference.DefaultValidator的实现。 -
输出编码
在sql注入语境中,将发送给数据库的内容进行编码(或转义)是必需的操作,可以保证内容被正确的处理。
针对Mysql的编码举例:在动态sql中提交的信息(LIKE语句中使用通配符的位置)添加引用。
sql = sql.replace("%",“\%”); //%匹配0个或多个任意字符sql = sql.replace("_",“\_”); //_匹配任意一个字符
备注:在动态sql和拼接sql场景下也可以利用ESAPI进行转义处理
// ESAPI转义,防SQL注入public static String encodeForSql(String input) {MySQLCodec mysqlCodec = new MySQLCodec(MySQLCodec.Mode.STANDARD);return ESAPI.encoder().encodeForSQL(mysqlCodec, input);}// 说明: esapi需要有两个配置文件:ESAPI.properties、validation.properties
小结:输入校验和输出编码是处理注入问题(如xss)的一贯套路。
4. SQL注入防御举例
4.1 使用JDBC时,SQL语句进行了拼接
1. 使用statement的executeQuery、execute、executeUpdate等函数时,传入的SQL语句拼接了来自外部的不可信参数。
**错误示例**String userName = ctx.getAuthenticatedUserName(); //this is a constant//itemName是外部读入的参数拼接到SQL语句String sqlString = "SELECT * FROM t_item WHERE owner='" + userName + "' AND itemName='" + request.getParameter("itemName") + "'";stmt = connection.createStatement();rs = stmt.executeQuery(sqlString);
解决方法 1) 使用预编译方式(不可信数据作为字段值); 2) 对拼接到SQL语句中的外部参数进行白名单校验(不可信数据作为表名,字段名,排序方式)。
**正确示例**:使用白名单校验方式校验itemNameString userName = ctx.getAuthenticatedUserName(); //this is a constantString itemName=getCleanedItemName(request.getParameter("itemName"));String sqlString = "SELECT * FROM t_item WHERE owner='" + userName + "' AND itemName='" + itemName + "'";stmt = connection.createStatement();rs = stmt.executeQuery(sqlString);
2. 使用connection的PreparedStatement时,使用的SQL语句拼接了来自外部的不可信参数。
**错误示例**String userName = ctx.getAuthenticatedUserName(); //this is a constant//itemName是外部读入的参数拼接到SQL语句String itemName = request.getParameter("itemName");// ...Ensure that the length of userName and itemName is legitimate// ...String sqlString = "SELECT * FROM t_item WHERE owner=? AND itemName='"+itemName+"'";PreparedStatement stmt = connection.prepareStatement(sqlString);stmt.setString(1, userName);rs = stmt.executeQuery();
解决方法 1) 将拼接方式改为占位符方式; 2). 对拼接到SQL语句中的外部参数进行白名单校验。
**正确示例**:所有的参数使用占位符String userName = ctx.getAuthenticatedUserName(); //this is a constantString itemName = request.getParameter("itemName");// ...Ensure that the length of userName and itemName is legitimate// ...String sqlString = "SELECT * FROM t_item WHERE owner=? AND itemName=?";PreparedStatement stmt = connection.prepareStatement(sqlString);stmt.setString(1, userName); // jdbc编号从1开始stmt.setString(2, itemName);rs = stmt.executeQuery();
3. 存储过程使用动态方式构建SQL语句,导致SQL注入风险。
**错误示例**
REATE PROCEDURE sp_queryItem@userName varchar(50),@itemName varchar(50)
AS
BEGIN DECLARE @sql nvarchar(500); SET @sql = 'SELECT * FROM t_item WHERE owner = ''' + @userName + '''AND itemName = ''' + @itemName + '''';EXEC(@sql);
END
GO
解决方法 采用参数化查询的方式
**正确示例**:采用参数化查询的方式
CREATE PROCEDURE sp_queryItem@userName varchar(50), @itemName varchar(50)
AS
BEGIN SELECT * FROM t_item WHERE userName = @userNameAND itemName = @itemName;
END
GO
4.2 使用Hibernate时,调用API时,传入的SQL语句有拼接外部参数
1. 调用createQuery时,传入的SQL语句拼接了来自外部的不可信参数。
**错误示例**//SQL语句拼接不可信参数String itemName = request.getParameter("itemName");Query hqlQuery = session.createQuery("from Item as item where item.itemName = '" + itemName + "'");List<Item> hrs = (List<Item>) hqlQuery.list();
解决方法 1) 对拼接到SQL语句中的外部参数进行白名单校验; 2) 使用hibernate的配置映射关系方式。
**正确示例**:对外部参数进行白名单校验String itemName = request.getParameter("itemName");itemName=getCleanedItemName(itemName);//白名单校验Query hqlQuery = session.createQuery("from Item as item where item.itemName = '" + itemName + "'");List<Item> hrs = (List<Item>) hqlQuery.list();
4.3 使用MyBatis时,SQL语句使用$
占位符
1. 配置文件使用$
占位符
错误示例:// 使用$,底层将使用简单拼接 <select id="getItems" resultClass="Item">SELECT * FROM t_item WHERE owner = $userName$ AND itemName = $itemName$</select>
解决方法 1) 将$占位符改为#
占位符; 2) 如果外部不可信数据作为表名,字段名,排序方式,则对外部参数进行白名单校验。
**正确示例**:使用#占位符方式<select id="getItems" resultClass="Item">SELECT * FROM t_item WHERE owner = #userName# AND itemName =#itemName#</select>
2. mybatis接口中的函数标签的SQL语句,使用了$
占位符
**错误示例**public interface IUserDAO { //标注中的SQL语句通过$表示占位符,内部实现是单纯的拼接@Select("select *from User where id=${id}) User getUser(@Param("id")String id);}
**正确示例**:标注中的SQL语句通过'#'表示占位符,内部实现是参数化预处理public interface IUserDAO { @Select("select *from User where id=#{id}) User getUser(@Param("id")String id);}
end.
相关文章:
网络安全系列 之 SQL注入学习总结
1. sql注入概述 程序里面如果使用了未经校验的外部输入来构造SQL语句,就很可能会引入SQL注入漏洞。 注入攻击 对于字符串输入,如果这个字符串将被解释为某种指令,那么需要特别注意防止注入攻击。sql注入、os命令注入、xml注入是典型的攻击类…...
JVM中的方法绑定机制
JVM中的方法绑定机制主要分为静态绑定(Static Binding)和动态绑定(Dynamic Binding)两种。以下是关于这两种绑定机制的详细解释: 一、静态绑定(Static Binding) 定义:静态绑定是指在…...
tomato靶场攻略
前提:kali和tomato的连接方式都为net模式 tomato的默认网络连接方式为桥接模式,导入前注意修改,将tomato.ova的镜像导入虚拟机中 出现此页面则表示导入成功,打开kali虚拟机终端,切换为root权限 arp-scan -l 浏览器访…...
移动魔百盒中的 OpenWrt作为旁路由 安装Tailscale并配置子网路由实现在外面通过家里的局域网ip访问内网设备
移动魔百盒中的 OpenWrt作为旁路由 安装Tailscale并配置子网路由实现在外面通过家里的局域网ip访问内网设备 一、前提条件 确保路由器硬件支持: OpenWrt 路由器需要足够的存储空间和 CPU 性能来运行 Tailscale。确保设备架构支持 Tailscale 二进制文件,例…...
wxWidgets使用wxStyledTextCtrl(Scintilla编辑器)的正确姿势
开发CuteMySQL/CuteSqlite开源客户端的时候,需要使用Scintilla编辑器,来高亮显示SQL语句,作为C/C领域最成熟稳定又小巧的开源编辑器,Scintilla提供了强大的功能,wxWidgets对Scintilla进行包装后的是控件类:…...
Spring Boot中Bean的 构造器注入、字段注入和方法注入
在Spring中,依赖注入(DI)是实现控制反转(IoC)的一种方式,Spring提供了多种注入方式来将依赖关系注入到Bean中,常见的方式有构造器注入、字段注入和方法注入。下面将详细介绍这三种注入方式。 1…...
深入浅出支持向量机(SVM)
1. 引言 支持向量机(SVM, Support Vector Machine)是一种常见的监督学习算法,广泛应用于分类、回归和异常检测等任务。自1990年代初期由Vapnik等人提出以来,SVM已成为机器学习领域的核心方法之一,尤其在模式识别、文本…...
梯度下降的数学原理:用泰勒公式剖析梯度下降
梯度下降(Gradient Descent)是机器学习中非常核心的优化算法,通过不断调整模型参数,让损失函数(Loss Function)逐渐变小,从而提高模型的性能。损失函数是一个用来衡量预测值与真实值差距的函数&…...
城市应急指挥系统
城市应急指挥系统的重要性 随着现代化城市的高速发展,我们面临着多种应急突发情景,如自然灾害、事故灾难、公共卫生事件以及社会安全事件等。这些事件对城市的安全稳定构成严重威胁,因此,建立一套高效、全面的城市应急指挥系统显…...
pycharm 快捷键
PyCharm 是一款功能强大的集成开发环境(IDE),提供了丰富的快捷键来提高开发效率。以下是一些常用的 PyCharm 快捷键(基于 Windows/Linux 系统,Mac 系统可能略有不同): 通用快捷键 功能快捷键&a…...
游戏网站大全
http://piano.ssjjss.com/ 钢琴模拟器 https://gangqin.bmcx.com/?tdsourcetags_pcqq_aiomsg#/ 在线钢琴 https://www.gushiwen.cn/ 古诗文; https://www.bilibili.com/video/BV1UEWpeaEQK/ https://bouncyballs.org/ 掉落的球球 https://fakeupdate.net/ 假装升级界面 ht…...
线性代数期末总复习的点点滴滴(1)
一、可逆矩阵、行列式、秩的关系 1.行列式与可逆矩阵的关系 所以,不难看出矩阵可逆的充分必要条件是该矩阵的行列式不为0。 2.接着来看,满秩和矩阵行列式的关系 不难看出满秩和行列式不为0是等价的。 3.再来看,满秩和矩阵可逆的关系 说明了…...
感受野如何计算?
感受野(Receptive Field, RF)是卷积神经网络(CNN)中的一个重要概念,它指的是网络中某个特定神经元能够接收到的输入图像上的区域大小。换句话说,感受野定义了输出特征图中的每个单元依赖于输入图像中哪些像…...
0101多级nginx代理websocket配置-nginx-web服务器
1. 前言 项目一些信息需要通过站内信主动推动给用户,使用websocket。web服务器选用nginx,但是域名是以前通过阿里云申请的,解析ip也是阿里云的服务器,甲方不希望更换域名。新的系统需要部署在内网服务器,简单拓扑图如…...
解决 Ubuntu 20.04 和 ROS Noetic 中的 No Module Named ‘rospkg‘ 错误
解决 Ubuntu 20.04 和 ROS Noetic 中的 “No Module Named ‘rospkg’” 错误 在 Ubuntu 20.04 系统上运行 ROS Noetic 时,遇到了一个常见错误:“缺少 rospkg 模块”。这种问题主要是由于 Python 环境配置不当所导致。以下是对该问题的详细分析…...
day14-16系统服务管理和ntp和防火墙
一、自有服务概述 服务是一些特定的进程,自有服务就是系统开机后就自动运行的一些进程,一旦客户发出请求,这些进程就自动为他们提供服务,windows系统中,把这些自动运行的进程,称为"服务" window…...
java 根据路径下载文件转换为MultipartFile,并且上传到服务器
直接上代码 controller层 GetMapping("/downloadAndUploadAttachment")UpdateOperationLogging(msg "根据路径下载文件转换为MultipartFile,并且上传到服务器")Operation(summary "根据路径下载文件转换为MultipartFile,并且上传到服务器", de…...
递归实现指数型枚举(递归)
92. 递归实现指数型枚举 - AcWing题库 每个数有选和不选两种情况 我们把每个数看成每层,可以画出一个递归搜索树 叶子节点就是我们的答案 很容易写出每dfs函数 dfs传入一个u表示层数 当层数大于我们n时,去判断每个数字的选择情况,输出被选…...
WebMvcConfigurer和WebMvcConfigurationSupport(MVC配置)
一:基本介绍 WebMvcConfigurer是接口,用于配置全局的SpringMVC的相关属性,采用JAVABean的方式来代替传统的XML配置文件,提供了跨域设置、静态资源处理器、类型转化器、自定义拦截器、页面跳转等能力。 WebMvcConfigurationSupport是webmvc的…...
HIPT论文阅读
题目《Scaling Vision Transformers to Gigapixel Images via Hierarchical Self-Supervised Learning》 论文地址:[2206.02647] Scaling Vision Transformers to Gigapixel Images via Hierarchical Self-Supervised Learning 项目地址:mahmoodlab/HI…...
完全二叉树的权值(蓝桥杯2019年试题G)
给定一棵包含N个节点的完全二叉树,树上的每个节点都有一个权值,按从上到小、从左到右的顺序依次是A1、A2……An,(1,2,n为下标。)如下图所示。 现在,小明要把相同深度的节点的权值加到一起&#…...
用adb命令给APP做压力测试,有什么不同?
压力测试 app做压力测试目的是模拟用户在使用软件时随意向软件发出指令,例如操作app的点击,滑动,返回等一系列随机事件,来检测app的承受能力 第一步:手机安装包需要待测的app 第二步:输入adb start-ser…...
Spring 6 实现 Bean 异步初始化,减少项目启动时间
在 Spring 6 中,异步初始化 Bean 为优化应用启动性能提供了有力手段。通过让特定的 Bean 在后台进行初始化,避免其阻塞应用的启动流程,从而显著缩短应用从启动到对外提供服务的时间。 一、基础环境搭建 首先,确保项目的依赖中引入…...
【案例80】麒麟操作系统无法使用Uclient访问NC65
问题现象 麒麟操作系统,安装Uclient,添加应用后无法看到登录界面,一直在转圈。 问题分析 进入到Uclient的工作目录 发现在工作目录下,无相关app.log生成。 查看Uclient的main.log发现,有大量的报错与Uclient下的sha…...
一个签名笔迹量化分析专家辅助系统
写在正文前 关于签名的鉴定有国家制定的标准,一个小册子,好像是 80多页 ,俺看的还是 2000年版的,现在应该有很多新版本了。这方面有很多教材和书籍。而且国家也有专门的评审。 正文开始 这是翻老硬盘时发现的,09年左…...
富途证券C++面试题及参考答案
C++ 中堆和栈的区别 在 C++ 中,堆和栈是两种不同的内存区域,它们有许多区别。 从内存分配方式来看,栈是由编译器自动分配和释放的内存区域。当一个函数被调用时,函数内的局部变量、函数参数等会被压入栈中,这些变量的内存空间在函数执行结束后会自动被释放。例如,在下面的…...
鸿蒙app封装 axios post请求失败问题
这个问题是我的一个疏忽大意,在这里记录一下。如果有相同问题的朋友,可以借鉴。 当我 ohpm install ohos/axios 后,进行简单post请求验证,可以请求成功。 然后,我对axios 进行了封装。对axios 添加请求拦截器/添加响…...
详解 Qt WebEngine 模块
Qt WebEngine 模块是 Qt 提供的一个功能强大的模块,用于在 Qt 应用中嵌入和显示现代网页内容。该模块基于 Chromium 引擎,支持丰富的 Web 技术(如 HTML5、CSS3、JavaScript 等),适合需要嵌入网页浏览、Web 应用、JavaS…...
常用的缓存技术都有哪些
在计算机科学和软件开发领域,缓存技术是提高系统性能和响应速度 1. 本地缓存(Local Cache): • 存在于应用程序本地内存中的缓存,用于存储频繁访问的数据,以减少对外部存储(如数据库)…...
MySQL通过日志恢复数据的步骤
试验环境:Windows Server2012 r2、MySql-8.0.27-winx64。 1、先检查MySQL有没有开启binlog日志 通过下面的SQL命令查看MySQL是否开启日志以及日志文件的位置: show variables like %log_bin% 执行结果如下图所示: 图中,log_bi…...
SQL Server 表值函数使用示例
在 SQL Server 中,表值函数(Table-Valued Functions, TVFs)是一种用户定义函数,它可以返回一个表。表值函数有两种类型:内联表值函数(Inline Table-Valued Function)和多语句表值函数(Multi-Statement Table-Valued Function)。下面分别介绍这两种类型的表值函数及其使…...
计算机网络之多路转接epoll
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络之多路转接epoll 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交流讨论💌 目…...
BPMN与一般的流程图区别在那里?
1. 语义和标准性 BPMN(业务流程建模符号) 基于标准语义:BPMN是一种标准化的业务流程建模语言,拥有一套严谨的语义规范。它由国际对象管理组织(OMG)维护,定义了事件、活动、网关和流向等元素的确…...
内容与资讯API优质清单
作为开发者,拥有一套API合集是必不可少的。这个开发者必备的API合集汇集了各种实用的API资源,为你的开发工作提供了强大的支持!无论你是在构建网站、开发应用还是进行数据分析,这个合集都能满足你的需求。你可以通过这些免费API获…...
uniapp获取内容高度
获取内容高度 getNewsHieght(index) {uni.createSelectorQuery().select(.content_${index}).boundingClientRect(rect > {console.log(打印该盒子的元素, rect.height);swiperHeight.value rect.height// console.log(打印swiperHeight的数值,this.swiperHeight);}).exec…...
Unity局部和世界坐标系相互转换的实现原理
注:本篇是基于唐老师的学习视频做的一些理论实践,需要提前知道一些线性代数的基础知识,原视频链接: 8.数学基础知识学习说明_哔哩哔哩_bilibili 前期准备: 知识点①: Unity中需要遵守的设定:…...
数据结构(Java版)第六期:LinkedList与链表(一)
目录 一、链表 1.1. 链表的概念及结构 1.2. 链表的实现 专栏:数据结构(Java版) 个人主页:手握风云 一、链表 1.1. 链表的概念及结构 链表是⼀种物理存储结构上⾮连续存储结构,数据元素的逻辑顺序是通过链表中的引⽤链接次序实现的。与火车…...
浅谈文生图Stable Diffusion(SD)相关模型基础
1.U-Net模型基础 1.基础概念 UNet模型是一种基于卷积神经网络的图像分割算法,它采用了U型的网络结构,由编码器(下采样路径)和解码器(上采样路径)两部分组成。 编码器负责提取输入图像的特征,…...
7-10 函数和排序练习一
输入n个数(n<10),对其中的素数进行排序(剔除非素数),输出排序后的数列结果。 建议:编写若干函数,用以判断素数,以及对数组进行排序。 输入格式: 第一行是一个正整数t,表示测试的总数。 然后…...
【FFmpeg 教程 一】截图
本章使用 ffmpeg 实现观影中经常会用到的功能,截图。 以下给出两种方式。 课程需具备的基础能力:Python 1. 使用 subprocess 调用 FFmpeg 命令 import subprocess def extract_frame(video_path, output_image_path, timestamp"00:00:05")&qu…...
Python选择题训练工具:高效学习、答题回顾与音频朗读一站式体验
一、引言 随着人工智能技术的不断进步,传统的教学方式已经逐渐向智能化、互动化转变。在众多英语测试题型中,选择题作为一种高效的方式被广泛应用于各类培训与考试中。为了帮助学生高效学习与自测,本篇文章将采用Python编写一款基于 Python …...
【Python】使用Selenium 操作浏览器 自动化测试 记录
【自动化】Python SeleniumUtil 工具 开启开发者模式 自动安装油猴用户脚本等-CSDN博客文章浏览阅读389次。【自动化】Python SeleniumUtil 工具。https://blog.csdn.net/G971005287W/article/details/144565691?spm1001.2014.3001.5501【学习记录】浏览器指纹相关学习记录&am…...
汽车IVI中控开发入门及进阶(42):OpenVG
概览: OpenVG是一个无版权、跨平台的API,它为高级用户界面和矢量图形库(如SVG)提供了一个低级硬件加速接口。OpenVG主要针对需要便携式加速高质量矢量图形以获得引人注目的用户界面和文本的消费电子产品、手持设备、可穿戴设备和汽车设备,同时使硬件加速能够在非常低的功…...
两点间最短距离 - Dijkstra
一、汇总 算法场景说明参考BFS 树 无权图的搜索 标准BFS默认搜索一条最短路径 改造后可以输出所有最短路径 https://blog.csdn.net/m0_37145844/article/details/144534202DFS走迷宫主要利用回溯算法思想,不保证最短路径https://blog.csdn.net/m0_37145844/articl…...
0002__GPU
国内GPU公司主要包括以下几家: 摩尔线程:摩尔线程被誉为“中国版英伟达”,成立于2019年,由前英伟达全球副总裁张建中创立。该公司已获得425项授权专利,计划上市,目标估值高达1500亿元。摩尔线程的技术…...
StarRocks 排查单副本表
文章目录 StarRocks 排查单副本表方式1 查询元数据,检查分区级的副本数方式2 SHOW PARTITIONS命令查看 ReplicationNum修改副本数命令 StarRocks 排查单副本表 方式1 查询元数据,检查分区级的副本数 # 方式一 查询元数据,检查分区级的副本数…...
基于字节大模型的论文翻译(含免费源码)
基于字节大模型的论文翻译 源代码: 👏 star ✨ https://github.com/boots-coder/LLM-application 展示 项目简介 本项目是一个基于大语言模型(Large Language Model, LLM)的论文阅读与翻译辅助工具。它通过用户界面(…...
【原生js案例】ajax的简易封装实现后端数据交互
ajax是前端与后端数据库进行交互的最基础的工具,第三方的工具库比如jquery,axios都有对ajax进行第二次的封装,fecth是浏览器原生自带的功能,但是它与ajax还是有区别的,总结如下: ajax与fetch对比 实现效果 代码实现 …...
uniapp Native.js 调用安卓arr原生service
有问题,文中的内容不正确 最近搞了个uni小项目,一个定制的小平板,带一个nfc设备,厂家只给了一套安卓原生demo,头一次玩原生安卓,废了好半天劲打出来arr包,想镶进uniapp里,网上查了好…...
关于画火山图(by ggplot2)的一些总结和经验
愿武艺晴小朋友一定得每天都开心! 文献中常用经典的火山图,是展示差异表达基因的利器。每次测完转录组,做实验组和对照组的比较后,都会用到。 我自己也画了不算太多也不算太少的次数。然后最近画的时候忽然间意识到这个可视化方法我经常用,却没系统的整理过,一些tips散…...