SQL 注入详解:原理、危害与防范措施
文章目录
- 一、什么是SQL注入?
- 二、SQL注入的工作原理
- 三、SQL注入的危害
- 1. 数据泄露
- 2. 数据篡改
- 3. 拒绝服务
- 4. 权限提升
- 四、SQL注入的类型
- 1. 基于错误的信息泄露
- 2. 联合查询注入
- 3. 盲注
- (1). 基于布尔响应的盲注
- (2). 基于时间延迟的盲注
- 4. 基于带外的注入
- 五、防范SQL注入的方法
- 1. 使用预编译语句(PreparedStatement)
- 2. 输入验证
- 3. 最小权限原则
- 4. 使用ORM框架
- 5. 配置错误页面
- 6. 定期审计和测试
- 六、实际案例
- 七、总结
一、什么是SQL注入?
SQL注入是一种常见的安全漏洞,攻击者通过在应用程序中插入恶意的SQL代码,诱使数据库执行非授权的操作。这种攻击通常发生在应用程序没有正确过滤或转义用户输入的情况下,导致攻击者能够操控数据库查询,从而获取、修改或删除数据。
二、SQL注入的工作原理
SQL注入的核心在于攻击者能够通过用户输入点(如表单、URL 参数等)注入恶意的SQL代码。当应用程序将这些未经处理的输入直接嵌入到SQL查询中时,攻击者可以改变查询的逻辑,达到其目的。
三、SQL注入的危害
1. 数据泄露
攻击者可以读取敏感信息,如用户的个人信息、财务数据等。
2. 数据篡改
攻击者可以修改数据库中的数据,造成经济损失或信誉损害。
3. 拒绝服务
攻击者可以通过大量消耗数据库资源,使合法用户无法访问服务。
4. 权限提升
攻击者可能获得对数据库更高权限的访问,甚至控制整个数据库服务器。
四、SQL注入的类型
1. 基于错误的信息泄露
攻击者通过触发数据库错误,分析错误消息来推断数据库结构,进而构建更复杂的攻击。
示例:
SELECT * FROM users WHERE username = 'admin' AND password = 'wrong_password';
如果数据库返回错误消息,攻击者可以从中获取有关数据库结构的信息。
2. 联合查询注入
攻击者利用UNION操作符将额外的查询附加到原查询上,以获取额外的信息。
示例:
SELECT * FROM users WHERE username = 'admin' UNION SELECT * FROM sensitive_data;
3. 盲注
当应用程序不会显示任何错误消息时,攻击者通过观察应用程序的行为变化来判断SQL语句的执行结果。这包括基于布尔响应的盲注和基于时间延迟的盲注。
(1). 基于布尔响应的盲注
攻击者通过发送不同的查询并观察应用程序的响应来推断数据库内容。
示例:
SELECT * FROM users WHERE username = 'admin' AND password = 'password' AND '1'='1';
如果查询成功,说明条件成立;否则,条件不成立。
(2). 基于时间延迟的盲注
攻击者通过在查询中引入时间延迟来判断数据库的响应时间,从而推断数据库内容。
示例:
SELECT * FROM users WHERE username = 'admin' AND password = 'password' AND SLEEP(5);
4. 基于带外的注入
攻击者利用数据库的功能,如HTTP请求或文件写入,将数据发送到外部服务器,从而泄露信息。
示例:
SELECT * FROM users WHERE username = 'admin' AND password = 'password' INTO OUTFILE '/tmp/data.txt';
五、防范SQL注入的方法
1. 使用预编译语句(PreparedStatement)
预编译语句会自动对参数进行转义处理,避免了SQL注入的风险。
示例:
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, password);
ResultSet rs = pstmt.executeQuery();
2. 输入验证
对所有用户输入进行严格的验证,确保输入符合预期格式。例如,可以限制用户名只能包含字母和数字。
示例:
if (!username.matches("[a-zA-Z0-9]+")) {throw new IllegalArgumentException("无效的用户名");
}
3. 最小权限原则
应用程序使用的数据库账户应该具有最小必要权限,避免因SQL注入导致的更大范围的数据破坏。
示例:
- 创建一个只读用户账户,用于查询操作。
- 创建一个具有有限写权限的用户账户,用于插入、更新和删除操作。
4. 使用ORM框架
ORM(Object-Relational Mapping)框架如Hibernate、MyBatis等,可以有效地防止SQL注入,因为它们内部实现了安全的SQL构建机制。
示例:
// Hibernate 示例
Session session = sessionFactory.openSession();
User user = (User) session.createQuery("FROM User WHERE username = :username AND password = :password").setParameter("username", username).setParameter("password", password).uniqueResult();
5. 配置错误页面
避免向用户显示详细的错误信息,以免泄露数据库结构等敏感信息。
示例:
<!-- web.xml 中配置错误页面 -->
<error-page><error-code>500</error-code><location>/error/500.jsp</location>
</error-page>
6. 定期审计和测试
定期对应用程序进行安全审计和渗透测试,及时发现和修复潜在的安全漏洞。
示例:
- 使用自动化工具(如OWASP ZAP、Nikto等)进行安全扫描。
- 雇佣专业的安全团队进行渗透测试。
六、实际案例
假设有一个登录功能,用户通过输入用户名和密码尝试登录。如果开发者直接拼接SQL语句,而没有对输入进行适当的处理,就可能存在SQL注入风险。
不安全的代码示例:
String sql = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
攻击者输入:
- 用户名:
admin' OR '1'='1 - 密码:
anything
生成的SQL语句:
SELECT * FROM users WHERE username = 'admin' OR '1'='1' AND password = 'anything'
在这个例子中,攻击者通过输入特殊字符使得SQL语句的逻辑发生变化,导致查询条件始终成立,从而绕过了身份验证。
七、总结
SQL注入是一个严重的安全问题,开发者必须采取有效措施来预防。使用预编译语句、严格验证用户输入、遵循最小权限原则等都是防范SQL注入的有效手段。此外,定期的安全审查和测试也是保障应用安全的重要环节。通过这些措施,可以大大降低SQL注入的风险,保护应用程序和用户数据的安全。
相关文章:
SQL 注入详解:原理、危害与防范措施
文章目录 一、什么是SQL注入?二、SQL注入的工作原理三、SQL注入的危害1. 数据泄露2. 数据篡改3. 拒绝服务4. 权限提升 四、SQL注入的类型1. 基于错误的信息泄露2. 联合查询注入3. 盲注(1). 基于布尔响应的盲注(2). 基于时间延迟的盲注 4. 基于带外的注入 五、防范SQ…...
如何用Java爬虫“采集”商品订单详情的编程旅程
在这个数据驱动的世界里,如果你不是数据,那么你一定是在收集数据。就像蜜蜂采集花粉一样,我们程序员也需要采集数据,以便分析、优化和做出明智的决策。今天,我们就来聊聊如何使用Java编写一个爬虫,这个爬虫…...
《FreeRTOS任务基础知识篇》
FreeRTOS任务基础知识 1. 什么是多任务系统?2. FreeRTOS任务3. 任务状态3.1 运行态3.2 就绪态3.3 阻塞态3.4 挂起态 4. 任务优先级5. 任务的实现6. 任务控制块7. 任务堆栈 FreeRTOS的核心是任务管理,以下介绍FreeRTOS任务的一些基础知识。 1. 什么是多任…...
前端面试笔试(二)
目录 一、数据结构算法等综合篇 1.HTTP/2、ETag有关 二、代码输出篇 1.new URL,url中的hostname,pathname,href 扩展说一下url的组成部分和属性 URL的组成部分 urlInfo 对象的属性 2.一个递归的输出例子 3.数组去重的不普通方法1 4.数…...
基于Python 和 pyecharts 制作招聘数据可视化分析大屏
在本教程中,我们将展示如何使用 Python 和 pyecharts 库,通过对招聘数据的分析,制作一个交互式的招聘数据分析大屏。此大屏将通过不同类型的图表(如柱状图、饼图、词云图等)展示招聘行业、职位要求、薪资分布等信息。 …...
探索光耦:晶体管光耦——智能家居的隐形桥梁,让未来生活更智能
在这个日新月异的科技时代,智能家居正以前所未有的速度融入我们的日常生活,从智能灯光到温控系统,从安防监控到语音助手,每一处细节都透露着科技的温度与智慧。而在这场智能化浪潮中,一个看似不起眼却至关重要的组件—…...
三、模板与配置(上)
三、模板与配置 1、WXML模板语法-数据、属性绑定 讲解: 1-1、数据绑定的基本原则 在data中定义数据 Page({data: {//这里是你需要定义的数据} })在WXML中使用数据 {{ 你定义的数据 }}1-2、在data中定义页面的数据 在页面对应的.js文件中,把数据定…...
基于SpringBoot和Vue的公司文档管理系统设计与开发(源码+定制+开发)
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...
Java21 Switch最全使用说明
Java21 Switch最全使用说明 Java 21 对 switch 语句进行了重大的改进和增强,使其变得更加灵活和强大。本文将详细介绍 Java 21 中 switch 语句的各种用法,包括基本语法、新特性、高级用法和最佳实践。 1. 基本语法 1.1 传统的 switch 语句 传统的 sw…...
普通电脑上安装属于自己的Llama 3 大模型和对话客户端
#大模型下载地址:# Llama3 因为Hugging Face官网正常无法访问,因此推荐国内镜像进行下载: 官网地址:https://huggingface.co 国内镜像:https://hf-mirror.com GGUF 模型文件名称接受,如上述列表中&…...
微信小程序原生 canvas画布截取视频帧保存为图片并进行裁剪
html页面: 视频尺寸过大会画布会撑开屏幕,要下滑 尺寸和视频链接是从上个页面点击传过来的,可自行定义 <canvas id"cvs1" type"2d" style"width: {{videoWidth}}px;height: {{videoHeight}}px;"><…...
社交网络图中结点的“重要性”计算
题目描述 输入 输出 输入样例1 9 14 1 2 1 3 1 4 2 3 3 4 4 5 4 6 5 6 5 7 5 8 6 7 6 8 7 8 7 9 3 3 4 9 输出样例1 Cc(3)0.47 Cc(4)0.62 Cc(9)0.35 AC代码 #include <iostream> #include <vector> #include <queue> #include <iomanip>using na…...
前端(1)——快速入门HTML
参考: W3school 1. HTML 我使用的是vs code,在使用之前,先安装以下几个插件: Auto Rename TageHTML CSS SupportLive Server 1.1 HTML标签 HTML全称是 Hypertext Markup Language(超文本标记语言) HTML通过一系列的标签(也称为…...
gitlab角色、权限
GitLab是一个基于Web的Git仓库管理工具,它提供了一套完整的角色和权限管理机制,以控制用户对项目和仓库的访问和操作权限。以下是GitLab中不同角色的基本权限概述: 访客(Guest): 可以查看项目中的公开信息。…...
Python办公——批量eml文件提取附件
目录 专栏导读背景1、库的介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动…...
Spring Boot 中 Druid 连接池与多数据源切换的方法
Spring Boot 中 Druid 连接池与多数据源切换的方法 在Spring Boot项目中,使用Druid连接池和进行多数据源切换是常见的需求,尤其是在需要读写分离、数据库分片等复杂场景下。本文将详细介绍如何在Spring Boot中配置Druid连接池并实现多数据源切换。 一、…...
JavaScrip中私有方法的创建
在 JavaScript 中,私有方法是指只能在类的内部使用,外部无法访问的函数。为了实现这一点,JavaScript 提供了几种方法,主要通过以下几种方式来创建私有方法: 1. 使用 #(私有字段和方法) 从 ECM…...
.Net Core根据文件名称自动注入服务
.Net Core根据文件名称自动注入服务 说明分析逻辑所有代码一键注入 说明 这个适用于.Net Core 的Web项目,且需要在服务中注入接口的需求.因为之前些Java Web习惯了,所以会有Dao层,Serivce层和Controller层.但是如果一个项目里面对于不同的数据库会有多个Dao,如果一个一个引入会…...
APT 参与者将恶意软件嵌入 macOS Flutter 应用程序中
发现了一些恶意软件样本,这些样本据信与朝鲜民主主义人民共和国 (DPRK)(又称北朝鲜)有关,这些样本使用 Flutter 构建,Flutter 的设计可以对恶意代码进行混淆。JTL 深入研究了恶意代码的工作原理,以帮助保护…...
第 3 章 -GO语言 基本语法
1. 注释 在编程中,注释是帮助理解代码的重要工具。Go语言支持两种类型的注释: 单行注释:以 // 开头,直到行尾都是注释。多行注释:以 /* 开始,以 */ 结束,可以跨越多行。 示例 package maini…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
