安全开发基础篇-数据溢出
上一节我们简单讲解了多语言的数据类型,我们只需要知道这个概念,并且在不同语言有不同的规矩就好。这节讲数据溢出,严格说应该是字符串溢出和整数溢出。
在软件开发中,字符串和整数溢出漏洞是常见的安全问题,它们可能导致程序崩溃、数据损坏甚至安全漏洞。不同的编程语言由于其内存管理和类型系统的不同,对这类漏洞的表现形式和处理方式也有所区别。按照安全常见的场景,本文将探讨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 系统无法启动。您的数据可能会被损坏…...
企业数据安全第一关:基于RBAC模型,用CloudQuery搞定数据库权限管控与审计日志
企业数据安全第一关:基于RBAC模型构建数据库权限管控与审计体系 当企业业务规模从初创期迈向成长期时,数据库访问权限往往像一间未经整理的仓库——所有人都能找到入口,但没人清楚哪些物品可以触碰。某互联网金融公司的技术负责人曾分享过这样…...
C语言状态模式实战:从设计思想到嵌入式状态机实现
1. 项目概述:从“状态”到“模式”的思维跃迁在嵌入式开发、游戏逻辑、网络协议解析乃至日常的业务流程控制中,我们常常会面对一个核心挑战:如何优雅地管理一个对象随着内部条件改变而表现出的不同行为?比如,一个自动售…...
AI技能框架实战:构建可扩展的智能体工具调用系统
1. 项目概述:当AI技能成为你的私人助理 最近在折腾AI应用开发的朋友,可能都绕不开一个核心问题:如何让大语言模型(LLM)不只是个“聊天高手”,而是能真正帮你处理具体事务的“实干家”?比如&…...
Kimsuky 组织基于 PebbleDash 与 AppleSeed 的攻击战术演进与技术分析
摘要 Kimsuky(亦称 APT43、Ruby Sleet 等)是活跃逾十年的朝鲜语系高级持续性威胁(APT)组织,长期针对韩国及全球多国政府、国防、医疗等关键领域实施定向攻击。本文基于卡巴斯基 GReAT 团队 2026 年 5 月公开的最新攻击…...
别再死记硬背了!用Python+Control库,5分钟可视化开环零极点对根轨迹的实际影响
用Python可视化开环零极点对根轨迹的动态影响 在传统控制理论教学中,根轨迹分析往往停留在纸面推导和静态图表上,让学生陷入复杂的相角条件和幅值计算中。这种抽象的学习方式容易造成"学完就忘"的困境——你或许能背诵"增加开环零点会使根…...
3步搞定抖音资源下载:免费高效的douyin-downloader完整指南
3步搞定抖音资源下载:免费高效的douyin-downloader完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback …...
国产碳化硅MOSFET在通讯电源PFC中的应用与实战解析
1. 项目概述:当通讯电源遇上国产碳化硅MOSFET最近在做一个通讯电源的PFC(功率因数校正)项目,客户对效率、功率密度和可靠性提出了近乎苛刻的要求。传统的硅基MOSFET方案,在追求更高开关频率以减小磁性元件体积时&#…...
HoRain云--Skills 基本结构
🎬 HoRain 云小助手:个人主页 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …...
在Windows上安装安卓应用的终极指南:告别模拟器,享受原生体验
在Windows上安装安卓应用的终极指南:告别模拟器,享受原生体验 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾梦想在Windows电脑上直接…...
SecureCRT 9.1.0不止是安装:揭秘高级功能如会话日志、脚本自动化与安全配置最佳实践
SecureCRT 9.1.0高阶实战:从会话审计到自动化运维的全栈指南 SecureCRT早已超越基础终端工具的范畴,成为运维工程师手中的瑞士军刀。当大多数教程还在反复讲解安装步骤时,真正的高阶用户已经在用会话日志构建操作审计体系,通过脚本…...
