SQL注入原理、类型、危害与防御
SQL注入的原理概念
SQL注入是一种常见的网络攻击技术,攻击者通过在Web应用程序的输入字段中注入恶意构造的SQL代码,以欺骗后端数据库执行非预期的SQL命令。这种攻击可以导致数据泄露、权限提升、数据篡改甚至系统瘫痪。SQL注入可以分为多种类型,每种类型利用不同的数据库特性和应用程序漏洞。
以下为SQL注入的类型:
数字型注入
攻击者在输入参数中注入数字值,利用这些值来改变原始的SQL查询逻辑。例如,通过在查询参数中添加额外的条件,可以绕过验证逻辑,实现非法的数据访问或操作。
字符串注入
攻击者在输入参数中注入字符串,这些字符串可能包含特殊字符,如单引号、双引号等,用以关闭或修改SQL语句的结构,从而执行攻击者期望的命令。
联合查询注入(UNION注入)
攻击者通过注入UNION语句,将自己构造的SELECT查询与原始查询的结果合并,从而获取额外的数据库信息。这种类型的注入通常需要攻击者猜测或探测原始查询的列数和类型。
布尔盲注
在无法直接观察到数据库返回结果的情况下,攻击者通过构造SQL语句,利用数据库的TRUE或FALSE响应来判断查询条件是否成立,从而间接获取数据库信息。
时间盲注
类似于布尔盲注,攻击者通过构造SQL语句引起数据库的延迟响应,根据响应时间的差异来推断数据库信息。这种方法适用于应用程序不显示数据库错误或直接响应的情况。
堆叠注入
攻击者在一个查询中执行多条SQL语句,通常通过在SQL语句末尾添加分号来分隔多个语句。这种注入方法可以用来执行如删除表、关闭数据库等恶意操作。
SQL注入的危害
SQL注入的危害主要体现在以下几个方面:
数据泄露:攻击者可以通过SQL注入获取数据库中的敏感信息,如用户密码、个人资料、商业机密等。
权限提升:攻击者可能通过执行SQL命令获得数据库的更高权限,甚至完全控制数据库。
数据篡改:攻击者能够修改或删除数据库中的记录,影响业务正常运行,甚至引发法律纠纷。
系统瘫痪:攻击者可能执行大量消耗系统资源的操作,导致数据库乃至整个系统崩溃。
在真实的SQL注入中通常涉及构造特定的输入,以触发数据库的非正常行为。例如,在用户名字段中输入' OR 1=1 --,这样构造的输入会导致SQL查询的WHERE条件始终为真,从而绕过登录验证。另一个例子是使用布尔盲注技术,通过注入的SQL语句导致数据库返回不同的页面加载时间,从而推断出数据库中的信息。
可以怎样进行SQL注入防御:
1、使用参数化查询(PreparedStatements):这是防止SQL注入的最有效方法之一。通过使用参数化查询,您可以将SQL命令的结构与数据分离,确保用户提供的数据不会被当作SQL代码执行。大多数现代编程语言和数据库连接库都支持参数化查询。
2、输入验证和过滤:对所有用户输入进行严格的验证,拒绝不符合预期格式的数据。使用白名单方法过滤输入,只允许预期的字符和格式通过。
3、使用存储过程:存储过程是预定义的SQL语句集合,可以接受参数,并且可以在数据库中进行重复使用。通过调用存储过程,可以减少直接在应用程序代码中编写SQL语句的需要,从而降低SQL注入的风险。
4、最小权限原则:应用程序连接数据库的账号应仅具有执行必要操作的最小权限,避免使用超级管理员权限运行日常查询。
5、使用ORM框架:对象关系映射(ORM)框架通常提供内建的安全措施来防止SQL注入,因为它们抽象化了数据库交互,减少了直接编写SQL语句的需求。
6、避免动态拼接SQL语句:不要在代码中拼接SQL语句,特别是不要将用户输入直接拼接到SQL命令中,这是SQL注入攻击的常见途径23。
7、使用安全的数据库连接:确保数据库连接使用安全的配置,关闭不必要的功能,限制外部访问。
定期更新和维护数据库软件:保持数据库管理系统和应用程序框架的最新状态,及时打补丁以修复已知的安全漏洞。
8、使用Web应用防火墙(WAF):WAF可以在Web请求到达应用服务器之前检测并阻止SQL注入攻击。
9、编码输出:对动态内容进行适当的HTML实体编码,可以防止攻击者插入脚本或HTML标签。
以上能防住SQL注入,但是需要注意配置正确,否则仍能被注入,比如PDO:
1、如果PDO配置为使用仿真预处理(emulated prepares),那么实际上仍然是在本地进行数据的转义和拼接,这仍可能会被注入.
2、如果开发者正确使用PDO的预处理语句,而是手动拼接了SQL语句,那么SQL注入的风险依然存在.
3、动态SQL片段:如果需要动态构建SQL语句的某些部分(如表名、列名或复杂的SQL片段),而这些部分又来源于用户输入,那么传统的预处理语句可能无法提供足够的保护.
所以
1、始终使用真实预处理(PDO::ATTR_EMULATE_PREPARES 设置为 false),以便让数据库服务器处理参数的转义.
2、对于所有外部输入,都应该使用预处理语句和参数绑定,而不是手动拼接SQL语句.
3、对于不能通过预处理语句安全处理的动态SQL部分,应当进行严格的验证和清洁,确保它们不会被解释为SQL代码.
相关文章:
SQL注入原理、类型、危害与防御
SQL注入的原理概念 SQL注入是一种常见的网络攻击技术,攻击者通过在Web应用程序的输入字段中注入恶意构造的SQL代码,以欺骗后端数据库执行非预期的SQL命令。这种攻击可以导致数据泄露、权限提升、数据篡改甚至系统瘫痪。SQL注入可以分为多种类型…...
第2讲 数据库系统的结构抽象与演变
基本内容 数据库系统的标准结构?数据模型?数据库系统的演变与发展?重难点 一组概念的区分:三级模式两层映像,物理独立性和逻辑独立性一组概念的区分:数据→模式→数据模型几种数据模型的差异:网状/层次模型→关系模型→数据模型数据库系统的标准结构 (1)数据库系统的分…...
Git创建开发分支命名规则
git checkout -b feature/branchname 和 git checkout -b branchname 这两条命令的主要区别在于新分支的命名。 主要区别 分支命名: git checkout -b feature/branchname:新分支的名字是 feature/branchname,表示该分支属于一个特性开发&…...
【纯前端excel导出】vue2纯前端导出excel,使用xlsx插件,修改样式、合并单元格
一、使用第三方插件 1、安装 npm install xlsx-js-style 2、引入 import xlsx from xlsx-js-style xlsx插件是基础的导出,不可以修改样式,直接xlsx-style插件式修改样式的,所以这里直接用二者合体插件即可 二、页面使用 1、数据源 [{"…...
如何在极速浏览器中实现谷歌浏览器的扩展功能
在当今数字化时代,浏览器扩展功能极大地增强了我们的在线体验。尤其是谷歌浏览器,以其丰富的扩展生态而闻名。但是,如果你想在极速浏览器中使用这些谷歌浏览器的扩展功能,该怎么办呢?本文将为你详细解析如何实现这一目…...
Web安全 - 跨站点请求伪造CSRF(Cross Site Request Forgery)
文章目录 OWASP 2023 TOP 10CSRF 导图CSRF的基本概念CSRF的工作原理常见CSRF攻击模式CSRF防御策略补充建议应用场景实战防御策略选择1. CSRF Token(首选)2. SameSite Cookie属性3. 验证Referer和Origin4. 多因素认证 实现方案CSRF Token实现SameSite Coo…...
C++游戏开发完整学习路径
C游戏开发完整学习路径 引言 随着游戏行业的迅速发展,C作为主要的游戏开发语言,因其高效性和灵活性,依然受到广泛欢迎。C不仅在大型游戏开发中被广泛使用,而且在游戏引擎的构建、性能优化和复杂算法的实现中也扮演着关键角色。本…...
vue3之 shallowRef、markRaw
shallowRef 用于创建一个浅层响应式引用,只对顶层属性进行响应式处理。 markRaw 用于标记一个对象,使其完全跳过 Vue 的响应式系统。 这两者都可以用于优化性能,避免不必要的响应式开销,特别是在处理大型对象或第三方库对象时。 …...
影刀RPA实战:操作Mysql数据库
1.摘要 影刀RPA(Robotic Process Automation)是一种软件自动化工具,它可以模拟人类用户执行各种重复性任务,其中包括对数据库的操作。 我们可以使用软件自动化指令,通过获取数据库窗口对象来操作数据库,也…...
【c++】c++11多线程开发
2 C多线程 本文是参考爱编程的大丙c多线程部分内容,按照自己的理解对其进行整理的一篇学习笔记,具体一些APi的详细说明请参考大丙老师教程。 代码性能的问题主要包括两部分的内容,一个是前面提到资源的获取和释放,另外一个就是多…...
PW37R_V1 产品规格书
概述 PW37R_V1是一款采用3.7英寸黑白红三色电子纸显示的电子标签,采用一种先进的无线自动更新系统,实现无线传输。 通过http,mqtt协议更新数据和控制该款电子标签的显示等操作,显示内容可自定义。内置电池供电,可Typ…...
android11 usb摄像头添加多分辨率支持
部分借鉴于:https://blog.csdn.net/weixin_45639314/article/details/142210634 目录 一、需求介绍 二、UVC介绍 三、解析 四、补丁修改 1、预览的限制主要存在于hal层和framework层 2、添加所需要的分辨率: 3、hal层修改 4、frameworks 5、备…...
【开源免费】基于SpringBoot+Vue.JS房屋租赁系统(JAVA毕业设计)
本文项目编号 T 020 ,文末自助获取源码 \color{red}{T020,文末自助获取源码} T020,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…...
JavaScript全面指南(二)
🌈个人主页:前端青山 🔥系列专栏:Javascript篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript全面指南(二) 目录 21、说明如何使用JavaScript提交表单? 2…...
Nginx:Linux配置Nginx
目录 一、环境安装1.1 GCC编译器1.2 PCRE1.3 Zlib1.4 OpenSSL1.5 快速下载 二、Nginx源码简单安装2.1 下载安装包2.2 解压2.3 进入资源文件中2.4 编译、安装 三、Yum安装四、Nginx源码复杂安装4.1 参数介绍4.2 参数配置 五、卸载Nginx5.1 关闭Nginx进程5.2 将安装的Nginx删除5.…...
WebRTC音频 04 - 关键类
WebRTC音频01 - 设备管理 WebRTC音频 02 - Windows平台设备管理 WebRTC音频 03 - 实时通信框架 WebRTC音频 04 - 关键类(本文) 一、前言: 在WebRTC音频代码阅读过程中,我们发现有很多关键的类比较抽象,搞不清楚会导致代码阅读一脸懵逼。比如…...
Elasticsearch:Redact(编辑) processor
Redact 处理器使用 Grok 规则引擎来隐藏输入文档中与给定 Grok 模式匹配的文本。该处理器可用于隐藏个人身份信息 (Personal Identifying Information - PII),方法是将其配置为检测已知模式,例如电子邮件或 IP 地址。与 Grok 模式匹配的文本将被替换为可…...
O2OA结合备份脚本和定时任务进行数据库的备份,我们以MySQL数据库为例
概述 系统运行一段时间后,可能发生各种情况导致数据丢失,如硬件故障、人为错误、软件错误、病毒攻击等。定期备份可以帮助您保护数据免受这些风险的影响,以便在需要时能够恢复数据。 O2OA应用本身可以通过dump配置每天自定备份数据ÿ…...
Python自动化办公:批量提取PDF中的表格到Excel
在现代办公环境中,处理大量的PDF文件并提取其中的表格数据是一项常见而繁琐的任务。手动复制粘贴不仅耗时耗力,还容易出错。Python作为一种功能强大的编程语言,提供了丰富的工具包,可以高效地解决这一问题。本文将介绍如何使用Pyt…...
selenium有多个frame页时的操作方法(5)
之前文章我们提到,在webdriver.WebDriver类有一个switch_to方法,通过switch_to.frame()可以切换到不同的frame页然后才再定位某个元素做一些输入/点击等操作。 比如下面这个测试网站有2个frame页:http://www.sahitest.com/demo/framesTest.h…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
