安全开发基础篇-数据溢出
上一节我们简单讲解了多语言的数据类型,我们只需要知道这个概念,并且在不同语言有不同的规矩就好。这节讲数据溢出,严格说应该是字符串溢出和整数溢出。
在软件开发中,字符串和整数溢出漏洞是常见的安全问题,它们可能导致程序崩溃、数据损坏甚至安全漏洞。不同的编程语言由于其内存管理和类型系统的不同,对这类漏洞的表现形式和处理方式也有所区别。按照安全常见的场景,本文将探讨PHP、Python、Java、C和Go(Golang)这几种语言中字符串和整数溢出的表现形式,并提供示例代码。
PHP
整数溢出:PHP是一种弱类型语言,对于整数溢出,其表现相对温和。当整数值超出PHP整数类型的最大范围(通常是平台相关的,但通常是32位或64位),PHP会自动将整数转换为浮点数,从而避免了经典的整数溢出问题。但这种转换可能会引入精度损失,影响计算的准确性。
字符串溢出:PHP中字符串是动态分配内存的,理论上不会发生传统意义上的缓冲区溢出,因为字符串长度在分配内存时会自动调整。但不当处理用户输入,尤其是使用不安全的函数(如strcpy等)从C扩展中调用时,仍然可能间接引起安全问题,尽管这不是PHP语言本身的特性导致的。
因此使用Php的开发工程师,在溢出漏洞这一块,可以放宽心了,基本上不存在这类安全风险。
Python
整数溢出:Python中的整数类型(int)是自动扩展的,这意味着它能够处理任意大小的整数,直到系统内存耗尽,因此不会发生传统的整数溢出。
字符串溢出:Python的字符串(str)也是动态分配内存,不会因为字符串长度超过预设大小而溢出。Python在处理字符串时提供了丰富的安全功能,减少了溢出风险,但同样需要注意,如果使用C扩展或低级操作不当,仍可能引入安全漏洞。
但是 python是存在很多c库的,比如大模型的python库,底层其实是c的,这种情况python调用依然会产生溢出漏洞哦
Java
整数溢出:Java中的基本整数类型(如int、long)是有固定范围的,当运算结果超出类型的最大值或最小值时,会自动进行模运算,产生环绕效果,而不是报错或溢出。这虽不导致程序崩溃,但可能导致逻辑错误。
字符串溢出:Java的字符串(String)是不可变的,且内存管理由JVM自动处理,因此不会发生字符串溢出。字符串操作如拼接、截取等都是在堆上安全进行的,除非在极特殊情况下,如利用反射或JNI调用不安全的C代码。所以java语言在溢出这里也是安全
C
整数溢出:C语言中的整数溢出是一个严重的问题,因为C不会自动处理溢出。当整数运算结果超出类型范围时,会导致未定义行为,可能引起逻辑错误、程序崩溃或其他不可预料的后果。
字符串溢出:C语言中最著名的安全问题之一就是缓冲区溢出,尤其是在处理字符串时。使用诸如strcpy、sprintf等函数时,如果不小心复制的数据超过了目标缓冲区的大小,就会发生缓冲区溢出,这可能导致程序崩溃或被恶意利用进行攻击,如栈溢出攻击。
C语言的溢出值得单独写一个章节来讨论,实际上经典的溢出漏洞攻击几乎都是C/C++
示例代码(不安全):
#include <string.h>
char str[20];
strcpy(str, "Hello, World!"); // 安全
strcpy(str, "This is a very long string that will cause overflow"); // 溢出
在C语言中,存在多个常见的、容易导致溢出(特别是缓冲区溢出)的不安全函数。这些函数通常在进行内存操作时不会检查目标缓冲区的大小,从而可能导致数据溢出到相邻的内存区域,进而引发安全问题。以下是一些常见的不安全函数:
-
strcpy():
这个函数用于复制字符串,包括终止的空字符(\0)。但是,它不会检查目标缓冲区的大小,因此如果源字符串的长度大于或等于目标缓冲区的大小,就会发生缓冲区溢出。 -
strcat():
该函数用于将两个字符串连接起来。和strcpy()一样,它也不会检查目标缓冲区是否有足够的空间来存储结果字符串,这可能导致缓冲区溢出。 -
sprintf():
该函数用于将格式化的数据写入字符串。如果目标字符串缓冲区的大小不足以容纳格式化的结果,就会发生溢出。 -
gets():
该函数从标准输入读取一行数据,直到遇到换行符(但不包括换行符),然后将其存储在指定的字符串中。gets()不检查目标缓冲区的大小,因此它是非常危险的,已经被许多现代C库弃用或删除。 -
vsprintf()、**vsnprintf()**在不当使用时):
vsprintf()类似于sprintf(),但它接受一个va_list参数而不是可变数量的参数。如果不正确使用vsnprintf()(即没有正确设置缓冲区大小),则可能面临与sprintf()相同的问题。 -
memcpy()、memmove()(在不当使用时):
这两个函数用于内存拷贝。虽然它们本身不直接处理字符串,但如果不正确地指定源和目标缓冲区的大小,可能会导致数据被写入到意外的内存区域,间接引发安全问题。 -
scanf()(在某些用法中):
虽然scanf()可以限制读取的字符数,但如果不正确地使用格式字符串,它可能会读取过多的数据并溢出目标缓冲区。
为了避免这些溢出问题,应该使用更安全的替代函数,如:
- 使用
strncpy()代替strcpy(),但请注意strncpy()可能不会添加终止的空字符。 - 使用
strncat()代替strcat()。 - 使用
snprintf()代替sprintf(),以确保不会超出目标缓冲区的大小。 - 使用
fgets()代替gets(),因为fgets()允许指定缓冲区的大小。 - 对于
scanf(),确保使用宽度说明符来限制读取的字符数。
此外,还应注意在使用任何内存操作函数时,始终验证源数据的大小,并确保目标缓冲区足够大以容纳这些数据。
C语言的溢出漏洞(特别是整数溢出和缓冲区溢出)是严重的安全问题,它们可能导致程序崩溃、数据泄露甚至执行任意代码。为了防范这些漏洞,程序员应采取一系列措施,如使用安全的字符串处理函数(如strncpy、snprintf)、合理估计数据大小、启用编译器的栈保护选项(如GCC的-fstack-protector)等
Go
整数溢出:Go语言的整数类型(如int、uint)和大多数现代语言一样,遵循平台相关的大小,但Go在整数运算上进行了优化,提供了额外的整数类型(如int64、uint64)来明确大小,且整数运算遵循模运算规则,避免了某些类型的未定义行为。
字符串溢出:Go语言的字符串(string)是不可变的,并且底层实现为结构体,包含一个指向字符数组的指针和长度,因此不会直接发生字符串溢出。Go提供了安全的字符串操作函数,如strings包,避免了C语言中常见的缓冲区溢出问题。
结束语
不同的编程语言对字符串和整数溢出的处理方式不同。PHP和Python由于其动态类型和自动内存管理,不太容易出现传统意义上的溢出。Java和Go虽然在语言规范中对整数溢出有明确的定义,但仍然需要开发者注意。C语言由于其接近硬件的特性,对内存和整数溢出需要更加小心谨慎。作为安全员在遇到C语言的时候,就要更多关注溢出啦。关于溢出的漏洞建议看我二进制安全分类专栏!
相关文章:
安全开发基础篇-数据溢出
上一节我们简单讲解了多语言的数据类型,我们只需要知道这个概念,并且在不同语言有不同的规矩就好。这节讲数据溢出,严格说应该是字符串溢出和整数溢出。 在软件开发中,字符串和整数溢出漏洞是常见的安全问题,它们可能…...
Scanner工具类
扫描控制台输入 1.nextLine nextLine() 方法会扫描输入流中的字符,直到遇到行末尾的换行符 \n,然后将该行的内容作为字符串返回,同时,nextLine() 会将 Scanner 对象的位置移动到下一行的开头,以便下一次读取数据时从下…...
springboot3 集成GraalVM
目录 安装GraalVM 配置环境变量 Pom.xml 配置 build包 测试 安装GraalVM Download GraalVM 版本和JDK需要自己选择 配置环境变量 Jave_home 和 path 设置setting.xml <profile><id>graalvm-ce-dev</id><repositories><repository><id&…...
HumanoidBench——模拟仿人机器人算法有未来
概述 论文地址:https://arxiv.org/pdf/2403.10506 仿人机器人具有类似人类的外形,有望在各种环境和任务中为人类提供支持。然而,昂贵且易碎的硬件是这项研究面临的挑战。因此,本研究开发了使用先进模拟技术的 HumanoidBench。该基…...
实现前端用户密码重置功能(有源码)
引言 密码重置功能是任何Web应用程序中至关重要的一部分。当用户忘记密码时,密码重置功能可以帮助他们安全地重设密码。本文将介绍如何使用HTML、CSS和JavaScript(包括Vue.js)来实现前端的密码重置功能。 1. 项目结构 首先,我们…...
《双流多依赖图神经网络实现精确的癌症生存分析》| 文献速递-基于深度学习的多模态数据分析与生存分析
Title 题目 Dual-stream multi-dependency graph neural network enables precise cancer survival analysis 《双流多依赖图神经网络实现精确的癌症生存分析》 01 文献速递介绍 癌症是全球主要的死亡原因,2020年约有1930万新发癌症病例和近1000万癌症相关死亡…...
【Hive SQL 每日一题】在线峰值人数计算
文章目录 测试数据需求说明需求实现 测试数据 -- 创建 user_activity 表 DROP TABLE IF EXISTS user_activity ; CREATE TABLE user_activity (user_id STRING,activity_start TIMESTAMP,activity_end TIMESTAMP );-- 插入数据 INSERT INTO user_activity VALUES (user1, 2024…...
谷粒商城学习笔记-18-快速开发-配置测试微服务基本CRUD功能
文章目录 一,product模块整合mybatis-plus1,引入依赖2,product启动类指定mapper所在包3,在配置文件配置数据库连接信息4,在配置文件中配置mapper.xml映射文件信息 二,单元测试1,编写测试代码&am…...
机器学习库实战:DL4J与Weka在Java中的应用
机器学习是当今技术领域的热门话题,而Java作为一门广泛使用的编程语言,也有许多强大的机器学习库可供选择。本文将深入探讨两个流行的Java机器学习库:Deeplearning4j(DL4J)和Weka,并通过详细的代码示例帮助…...
MongoDB教程(一):Linux系统安装mongoDB详细教程
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、Ubuntu…...
leetcode74. 搜索二维矩阵
给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。…...
Redis 布隆过滤器性能对比分析
redis 实现布隆过滤器实现方法: 1、redis 的 setbit 和 getbit 特点:对于某个bit 设置0或1,对于大量的值需要存储,非常节省空间,查询速度极快,但是不能查询整个key所有的bit,在一次请求有大量…...
Java List不同实现类的对比
List不同实现类的对比 文章目录 List不同实现类的对比实现类之一ArrayList实现类之二 LinkedList实现类之三 Vector练习 java.util.Collection用于存储一个一个数据的框架子接口:List存储有序的、可重复的数据(相当于动态数组) ArrayList lis…...
【C语言】 —— 预处理详解(下)
【C语言】 —— 预处理详解(下) 前言七、# 和 \##7.1 # 运算符7.2 ## 运算符 八、命名约定九、# u n d e f undef undef十、命令行定义十一、条件编译11.1、单分支的条件编译11.2、多分支的条件编译11.3、判断是否被定义11.4、嵌套指令 十二、头文件的包…...
Jupyter Notebook简介
Jupyter Notebook是一个开源的Web应用程序,允许你创建和共享包含实时代码、方程、可视化和解释性文本的文档。它广泛用于数据清理和转换、数值模拟、统计建模、机器学习等领域。 Jupyter Notebook的优势包括: 1. **交互式计算**:可以在网页…...
ChatGPT 5.0:一年后的猜想
对于ChatGPT 5.0在未来一年半后的展望与看法,我们可以从以下几个方面进行详细探讨: 一、技术提升与功能拓展 语言翻译能力: ChatGPT 5.0在语言翻译方面有望实现更大突破。据推测,新版本将利用更先进的自然语言处理技术和深度学习…...
Java套红:指定位置合并文档-NiceXWPFDocument
需求:做个公文系统,需要将正文文档在某个节点点击套红按钮,实现文档套红 试了很多方法,大多数网上能查到但是实际代码不能找到关键方法,可能是跟包的版本有关系,下面记录能用的这个。 一:添加依…...
【操作系统】进程管理——进程的同步与互斥(个人笔记)
学习日期:2024.7.8 内容摘要:进程同步/互斥的概念和意义,基于软/硬件的实现方法 进程同步与互斥的概念和意义 为什么要有进程同步机制? 回顾:在《进程管理》第一章中,我们学习了进程具有异步性的特征&am…...
Qt:13.多元素控件(QLinstWidget-用于显示项目列表的窗口部件、QTableWidget- 用于显示二维数据表)
目录 一、QLinstWidget-用于显示项目列表的窗口部件: 1.1QLinstWidget介绍: 1.2属性介绍: 1.3常用方法介绍: 1.4信号介绍: 1.5实例演示: 二、QTableWidget- 用于显示二维数据表: 2.1QTabl…...
恢复出厂设置手机变成砖
上周,许多Google Pixel 6(6、6a、6 Pro)手机用户在恢复出厂设置后都面临着设备冻结的问题。 用户说他们在下载过程中遇到了丢失 tune2fs 文件的错误 。 这会导致屏幕显示以下消息:“Android 系统无法启动。您的数据可能会被损坏…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...
