【网络安全学习】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链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...