当前位置: 首页 > 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项目更新后需要客户手…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

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

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

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

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&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...