当前位置: 首页 > news >正文

【网络安全学习】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版)【时域可分层视频编码】 音视频编码

基础概念 时域可分层视频编码介绍 可分层视频编码&#xff0c;又叫可分级视频编码、可伸缩视频编码&#xff0c;是视频编码的扩展标准&#xff0c;目前常用的包含SVC&#xff08;H.264编码标准采用的可伸缩扩展&#xff09;和SHVC&#xff08;H.265编码标准采用的可扩展标准&…...

一个java类实现UDP代理转发

概述 实现一个UDP代理服务器&#xff0c;它监听一个指定的端口&#xff0c;将接收到的UDP数据包转发到目标主机&#xff0c;并将目标主机的响应转发回原始客户端。使用线程池来异步处理响应&#xff0c;并使用日志记录器来记录不同级别的日志信息。 源代码 import java.io.I…...

K8s问题案例分析

1.worker节点宕机&#xff0c;请说明一下pod的驱逐流程&#xff1a; k8s有一个节点控制器&#xff0c;节点控制器在一段时间内无法和kubelet通信&#xff0c;那么就会给节点打上unknown 状态&#xff0c;并自动创建NoExecute污点,避免调度器调度新的pod到该节点。同时已经在这…...

爬虫集群部署:Gerapy 框架详细解析

&#x1f680; 爬虫集群部署&#xff1a;Gerapy 框架详细解析 &#x1f6e0;️ Gerapy 环境搭建 Gerapy 是一个基于 Scrapy 的爬虫框架&#xff0c;专注于爬虫项目的管理和集群部署。下面将详细介绍如何搭建 Gerapy 环境&#xff0c;并进行初步配置。 Gerapy 环境搭建: 安装 …...

文本相似度 HanPL汉语言处理

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

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) 介绍 傅里叶变换是一种数学变换&#xff0c;用于将图像从空间域转换到频率域。它广泛应用于图像去噪和滤波。 原理 傅里叶变换将图像表示为频率成分的叠加&#xff0c;使得频率成分可以独立处理。通过对频率成分的分析和处理&#xff0…...

谷粒商城实战笔记-131~132-商城业务-商品上架-构造sku检索属性和库存查询

文章目录 一&#xff0c;131-商城业务-商品上架-构造sku检索属性1&#xff0c;开发目标2&#xff0c;详细设计2.1&#xff0c;根据spu_id获取所有的规格参数2.2&#xff0c;根据上一步中查询结果进一步确认是否可搜索2.3&#xff0c;将可搜索的属性封装到Java模型中 二&#xf…...

【Python学习-UI界面】PyQt5 QLabel小部件

序号组件说明详细介绍链接1QLabel用作占位符&#xff0c;用于显示不可编辑的文本、图像&#xff0c;或者动画GIF的电影。它也可以用作其他小部件的助记符键。2QLineEdit是最常用的输入字段。它提供了一个框&#xff0c;可以输入一行文本。要输入多行文本&#xff0c;需要使用QT…...

vue项目打包问题

缓存导致打包后js文件404 修改vue.config.js打包输出文件名为动态&#xff0c;例如取当前时间戳。 在index.html文件添加meta标签设置不缓存。 更新完包&#xff0c;假如用户此刻正访问某一个页面时&#xff0c;访问的包还是原来的情况导致出现bug 解决VUE项目更新后需要客户手…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...