【网络安全学习】SQL注入03:如何防止SQL注入
防止SQL注入,就必须清楚:数据库只负责执行SQL语句,根据SQL语句来返回相关数据。数据库并没有什么好的办法直接过滤SQL注入,哪怕是存储过程也不例外。
那么防止SQL注入就得从代码层面进行入手。
1. 严格的数据类型
Java、C#等强类型语言几乎可以完全忽略数字型注入,因为代码在接收参数后会对参数进行数据类型的转换,如果数据是字符串,那么程序便会发生异常,所以只要做好数据类型处理,就足以抵挡数字型SQL注入。
//接收ID参数,并转换为int类型
int id = Integer.parse Int(request.get Parameter("id"));
//查询新闻列表
News news = news Dao.find News By Id(id);
PHP、ASP这类弱类型语言并没有强制要求处理数据类型,这类语言会根据参数自动推导出数据类型。如:
$id = $_GET['id'];
$sql = "select * from news where id = $id ;";
$news = exec($sql);
从代码可以看出,在id处并没有强制数据类型,那么就会产生注入点,我们可以输入参数:**1 and 1=2 union select username,password,from user;--
**进行注入。
所以,只需要在代码阶段严格判断数据类型就可以避免。
2. 特殊字符转义
字符类型的数据无法通过加强数据类型校验进行解决,因为无法判断获取的string类型是否为恶意攻击,那么就需要对特殊字符进行转义。
在数据库查询字符串时,任何字符串都必须加上单引号,那么就将单引号等特殊字符进行转义就可以有效的防护字符型注入,例如:
# http://www.xxx.com/film?tag=喜剧
# SQL语句如下
select type,content from films where tag = '%喜剧' and 1=2 union select username,password from users --%'
防止SQL注入应该在程序中判断字符串是否存在敏感字符,如果存在,则根据相应的数据库进行转义。经过转义后,以上的sql语句如下:
select type,content from films where tag = '%喜剧\' and 1=2 union select username,password from users -- %'
二次注入攻击
二次注入攻击是一种较为隐蔽且难以防范的 SQL 注入攻击方式。它并非在首次数据输入时直接进行攻击,而是在后续对存储的这些数据进行再次使用时发动攻击。
例如,用户首次输入的看似合法的数据被存储到数据库中,而在之后的系统操作中,这些数据未经过充分的清理和验证就被直接用于构建新的 SQL 查询。
$username = $_POST['username'];
$sql = "INSERT INTO users (username) VALUES ('$username')";
// 执行插入操作
// 后续操作
$sql2 = "SELECT * FROM users WHERE username = '$username'";
如果最初输入的用户名包含恶意的 SQL 片段,在后续再次使用该用户名进行查询时,就可能引发安全问题。
要防范二次注入攻击,不仅需要在数据输入时进行严格的验证和处理,还需要在数据再次使用时保持警惕,确保数据的安全性。
3. 使用预编译语句
预编译语句是防止 SQL 注入的有效手段之一。在使用预编译语句时,数据库会先对查询的结构进行解析和编译,而将后续传入的参数视为纯粹的数据,不会将其解释为可执行的代码。
例如,在 Java 中可以这样使用预编译语句:
PreparedStatement statement = connection.prepareStatement("SELECT * FROM users WHERE username =?");
statement.setString(1, username);
通过这种方式,即使传入的参数包含恶意的字符或代码,也不会被数据库当作可执行的部分,从而有效地避免了 SQL 注入的风险。
而且,预编译语句还能提高数据库操作的性能,因为对于相同结构的查询,数据库不需要重复进行解析和编译的过程。
4. 最小权限原则
遵循最小权限原则也是保障数据库安全的重要措施。
GRANT SELECT, INSERT ON table_name TO user_name;
这意味着只授予用户执行必要操作所需的最低权限。如果用户仅仅需要读取数据,那就只赋予其读取权限,而不是赋予其修改或删除数据的权限。
这样,即使攻击者成功利用了某些漏洞进行注入攻击,由于权限的限制,其能够造成的损害也会被大大降低。
REVOKE DELETE ON table_name FROM user_name;
定期审查和调整用户权限,确保其权限始终与实际需求相符,也是不可忽视的环节。
5. 使用框架技术
许多现代的 Web 开发框架都内置了对 SQL 注入的防范机制。例如,Django、Ruby on Rails 等框架在处理数据库操作时,会自动采用安全的方式来构建和执行 SQL 语句,大大降低了开发者犯错的可能性。
使用这些框架可以节省开发者自行编写复杂的安全代码的时间和精力,同时也能够确保应用在数据库交互方面具有较高的安全性。
然而,即使使用了框架,开发者也不能完全依赖框架而忽略对输入数据的基本验证和处理。
因为框架提供的安全机制并非万无一失,仍然可能存在一些特殊情况或者框架未覆盖到的角落。
6. 存储过程
存储过程是一组为了完成特定功能的 SQL 语句集,经编译后存储在数据库中。使用存储过程可以有效地防止 SQL 注入攻击。
因为存储过程在创建时就已经经过了数据库的编译和验证,输入的参数会被严格按照预定的逻辑处理,不会被误解为恶意的代码。
例如,创建一个简单的存储过程来查询用户信息:
CREATE PROCEDURE get_user_info(IN user_id INT)
BEGINSELECT * FROM users WHERE id = user_id;
END;
在调用存储过程时,传递的参数会在预定义的安全范围内被处理。
同时,存储过程还可以提高数据库操作的效率和可维护性,减少网络传输的数据量。
🌈总结
SQL注入的危害虽然很大,但是可以杜绝,开发团队要有相应的安全开发规范,遵循规范进行开发可以在很大程度上解决SQL注入的问题✌️。
相关文章:
【网络安全学习】SQL注入03:如何防止SQL注入
防止SQL注入,就必须清楚:数据库只负责执行SQL语句,根据SQL语句来返回相关数据。数据库并没有什么好的办法直接过滤SQL注入,哪怕是存储过程也不例外。 那么防止SQL注入就得从代码层面进行入手。 1. 严格的数据类型 Java、C#等强…...
linux利用crontab捕获iotop
1.iotop介绍 iotop-简单的类似TOP 命令的I/O监视器 使用:iotop[选项] 描述:iotop监视Linux内核输出的I/O使用信息(需要2.6.20或更高版本),并显示系统上进程或线程的当前I/O使用情况表。至少需要在您的Linux内核构建…...

android13 关闭selinux 临时关闭或者永久关闭
总纲 android13 rom 开发总纲说明 目录 1.前言 2.情况分析 2.1 临时关闭 2.2 永久关闭 3.修改方法 3.1 临时修改 3.2 永久关闭 4.编译测试 5.彩蛋 1.前言 在Android操作系统中,SELinux(Security-Enhanced Linux)是一种安全模块,用于提供强制访问控制(MAC)安全…...

JetBrains GoLand单元测试不支持单个单元测试case执行
譬如函数代码 func AddInt(a, b int32) int32 {return a b } 单元测试代码: func TestAddInt(t *testing.T) {type args struct {a int32b int32}tests : []struct {name stringargs argswant int32}{{name: "add",args: args{a: 1, b: 2},want: 3},{n…...
基于STM32设计的盆栽种植自动管理系统(微信小程序)(201)
文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】设计实现的功能【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】ESP8266工作模式配置1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献1.4 开发工具的选择【1】设备端开发【2】上位机开发1.5 系统框…...
白骑士的PyCharm教学实战项目篇 4.1 Web应用开发
系列目录 上一篇:白骑士的PyCharm教学高级篇 3.5 团队协作与集成开发 在现代开发环境中,Web应用已经成为开发者们不可或缺的一部分。利用PyCharm强大的功能,开发Web应用变得更加高效和直观。本文将详细介绍如何基于PyCharm进行…...
Linux与Docker常用运维命令一览
大家好,欢迎各位工友。 在博主陆陆续续的运维过程中,经常会用到许多运维相关的命令,以往都是现用现查,如今抽时间都记录一下,便于查阅和使用。 Linux常用命令 文件和目录操作 ls:列出目录内容cd [direc…...
怎样在 SQL 中创建视图(VIEW),以及视图的作用和优势是什么?
在 SQL 中创建视图(VIEW)可以使用 CREATE VIEW 语句。语法如下: CREATE VIEW view_name AS SELECT column1, column2, … FROM table_name WHERE condition; 视图是一个虚拟的表,它由一个查询结果集定义。与实际的表不同&#x…...

Tomcat 使用和配置文件(详解)
一.tomcat 介绍 1. tomcat 概述 自从JSP发布之后,推出了各式各样的JSP引擎。Apache Group在完成GNUJSP1.0的开发以后,开始考虑在SUN的JSWDK基础上开发一个可以直接提供Web服务的JSP服务器,当然同时也支持 Servlet,这样Tomcat就诞…...

html+css+js+jquery实现一个 飘零的树叶
<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>飘落的枫叶</title><style>.maple {position: absolute;top: 0;color: #ff0000;}</style><script src"https://www.jq22.com…...

鸿蒙(API 12 Beta3版)【时域可分层视频编码】 音视频编码
基础概念 时域可分层视频编码介绍 可分层视频编码,又叫可分级视频编码、可伸缩视频编码,是视频编码的扩展标准,目前常用的包含SVC(H.264编码标准采用的可伸缩扩展)和SHVC(H.265编码标准采用的可扩展标准&…...
一个java类实现UDP代理转发
概述 实现一个UDP代理服务器,它监听一个指定的端口,将接收到的UDP数据包转发到目标主机,并将目标主机的响应转发回原始客户端。使用线程池来异步处理响应,并使用日志记录器来记录不同级别的日志信息。 源代码 import java.io.I…...

K8s问题案例分析
1.worker节点宕机,请说明一下pod的驱逐流程: k8s有一个节点控制器,节点控制器在一段时间内无法和kubelet通信,那么就会给节点打上unknown 状态,并自动创建NoExecute污点,避免调度器调度新的pod到该节点。同时已经在这…...
爬虫集群部署:Gerapy 框架详细解析
🚀 爬虫集群部署:Gerapy 框架详细解析 🛠️ Gerapy 环境搭建 Gerapy 是一个基于 Scrapy 的爬虫框架,专注于爬虫项目的管理和集群部署。下面将详细介绍如何搭建 Gerapy 环境,并进行初步配置。 Gerapy 环境搭建: 安装 …...

文本相似度 HanPL汉语言处理
文章目录 前言需求简介实操开始1. 添加pom.xml依赖2. 文本相似度工具类3. 案例验证4. 验证结果 总结 前言 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、 提示:以下是本篇文章正文内容,下面案例可供参考 需求 当我…...

Linux软件包管理器 yum
目录 0.前言 1.什么是软件包 2.rz和sz 2.1rz命令 2.2sz命令 2.3操作示例 3.安装前注意事项 3.1保证网络畅通 3.2确保权限 3.3配置软件仓库 3.4 检查系统更新 4.查看软件包 5.安装软件 5.1作为root用户安装软件 5.2作为非root用户安装软件 5.3注意事项 6.卸载软件 6.1使用yum卸载…...

图像变换算法
1.1 傅里叶变换 (Fourier Transform) 介绍 傅里叶变换是一种数学变换,用于将图像从空间域转换到频率域。它广泛应用于图像去噪和滤波。 原理 傅里叶变换将图像表示为频率成分的叠加,使得频率成分可以独立处理。通过对频率成分的分析和处理࿰…...

谷粒商城实战笔记-131~132-商城业务-商品上架-构造sku检索属性和库存查询
文章目录 一,131-商城业务-商品上架-构造sku检索属性1,开发目标2,详细设计2.1,根据spu_id获取所有的规格参数2.2,根据上一步中查询结果进一步确认是否可搜索2.3,将可搜索的属性封装到Java模型中 二…...
【Python学习-UI界面】PyQt5 QLabel小部件
序号组件说明详细介绍链接1QLabel用作占位符,用于显示不可编辑的文本、图像,或者动画GIF的电影。它也可以用作其他小部件的助记符键。2QLineEdit是最常用的输入字段。它提供了一个框,可以输入一行文本。要输入多行文本,需要使用QT…...

vue项目打包问题
缓存导致打包后js文件404 修改vue.config.js打包输出文件名为动态,例如取当前时间戳。 在index.html文件添加meta标签设置不缓存。 更新完包,假如用户此刻正访问某一个页面时,访问的包还是原来的情况导致出现bug 解决VUE项目更新后需要客户手…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...

密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...