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

安全开发基础篇-数据溢出

上一节我们简单讲解了多语言的数据类型,我们只需要知道这个概念,并且在不同语言有不同的规矩就好。这节讲数据溢出,严格说应该是字符串溢出和整数溢出。

在软件开发中,字符串和整数溢出漏洞是常见的安全问题,它们可能导致程序崩溃、数据损坏甚至安全漏洞。不同的编程语言由于其内存管理和类型系统的不同,对这类漏洞的表现形式和处理方式也有所区别。按照安全常见的场景,本文将探讨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语言中,存在多个常见的、容易导致溢出(特别是缓冲区溢出)的不安全函数。这些函数通常在进行内存操作时不会检查目标缓冲区的大小,从而可能导致数据溢出到相邻的内存区域,进而引发安全问题。以下是一些常见的不安全函数:

  1. strcpy()
    这个函数用于复制字符串,包括终止的空字符(\0)。但是,它不会检查目标缓冲区的大小,因此如果源字符串的长度大于或等于目标缓冲区的大小,就会发生缓冲区溢出。

  2. strcat()
    该函数用于将两个字符串连接起来。和strcpy()一样,它也不会检查目标缓冲区是否有足够的空间来存储结果字符串,这可能导致缓冲区溢出。

  3. sprintf()
    该函数用于将格式化的数据写入字符串。如果目标字符串缓冲区的大小不足以容纳格式化的结果,就会发生溢出。

  4. gets()
    该函数从标准输入读取一行数据,直到遇到换行符(但不包括换行符),然后将其存储在指定的字符串中。gets()不检查目标缓冲区的大小,因此它是非常危险的,已经被许多现代C库弃用或删除。

  5. vsprintf()、**vsnprintf()**在不当使用时):
    vsprintf()类似于sprintf(),但它接受一个va_list参数而不是可变数量的参数。如果不正确使用vsnprintf()(即没有正确设置缓冲区大小),则可能面临与sprintf()相同的问题。

  6. memcpy()memmove()(在不当使用时):
    这两个函数用于内存拷贝。虽然它们本身不直接处理字符串,但如果不正确地指定源和目标缓冲区的大小,可能会导致数据被写入到意外的内存区域,间接引发安全问题。

  7. 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语言的时候,就要更多关注溢出啦。关于溢出的漏洞建议看我二进制安全分类专栏!

相关文章:

安全开发基础篇-数据溢出

上一节我们简单讲解了多语言的数据类型&#xff0c;我们只需要知道这个概念&#xff0c;并且在不同语言有不同的规矩就好。这节讲数据溢出&#xff0c;严格说应该是字符串溢出和整数溢出。 在软件开发中&#xff0c;字符串和整数溢出漏洞是常见的安全问题&#xff0c;它们可能…...

Scanner工具类

扫描控制台输入 1.nextLine nextLine() 方法会扫描输入流中的字符&#xff0c;直到遇到行末尾的换行符 \n&#xff0c;然后将该行的内容作为字符串返回&#xff0c;同时&#xff0c;nextLine() 会将 Scanner 对象的位置移动到下一行的开头&#xff0c;以便下一次读取数据时从下…...

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——模拟仿人机器人算法有未来

概述 论文地址&#xff1a;https://arxiv.org/pdf/2403.10506 仿人机器人具有类似人类的外形&#xff0c;有望在各种环境和任务中为人类提供支持。然而&#xff0c;昂贵且易碎的硬件是这项研究面临的挑战。因此&#xff0c;本研究开发了使用先进模拟技术的 HumanoidBench。该基…...

实现前端用户密码重置功能(有源码)

引言 密码重置功能是任何Web应用程序中至关重要的一部分。当用户忘记密码时&#xff0c;密码重置功能可以帮助他们安全地重设密码。本文将介绍如何使用HTML、CSS和JavaScript&#xff08;包括Vue.js&#xff09;来实现前端的密码重置功能。 1. 项目结构 首先&#xff0c;我们…...

《双流多依赖图神经网络实现精确的癌症生存分析》| 文献速递-基于深度学习的多模态数据分析与生存分析

Title 题目 Dual-stream multi-dependency graph neural network enables precise cancer survival analysis 《双流多依赖图神经网络实现精确的癌症生存分析》 01 文献速递介绍 癌症是全球主要的死亡原因&#xff0c;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功能

文章目录 一&#xff0c;product模块整合mybatis-plus1&#xff0c;引入依赖2&#xff0c;product启动类指定mapper所在包3&#xff0c;在配置文件配置数据库连接信息4&#xff0c;在配置文件中配置mapper.xml映射文件信息 二&#xff0c;单元测试1&#xff0c;编写测试代码&am…...

机器学习库实战:DL4J与Weka在Java中的应用

机器学习是当今技术领域的热门话题&#xff0c;而Java作为一门广泛使用的编程语言&#xff0c;也有许多强大的机器学习库可供选择。本文将深入探讨两个流行的Java机器学习库&#xff1a;Deeplearning4j&#xff08;DL4J&#xff09;和Weka&#xff0c;并通过详细的代码示例帮助…...

MongoDB教程(一):Linux系统安装mongoDB详细教程

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、Ubuntu…...

leetcode74. 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。…...

Redis 布隆过滤器性能对比分析

redis 实现布隆过滤器实现方法&#xff1a; 1、redis 的 setbit 和 getbit 特点&#xff1a;对于某个bit 设置0或1&#xff0c;对于大量的值需要存储&#xff0c;非常节省空间&#xff0c;查询速度极快&#xff0c;但是不能查询整个key所有的bit&#xff0c;在一次请求有大量…...

Java List不同实现类的对比

List不同实现类的对比 文章目录 List不同实现类的对比实现类之一ArrayList实现类之二 LinkedList实现类之三 Vector练习 java.util.Collection用于存储一个一个数据的框架子接口&#xff1a;List存储有序的、可重复的数据&#xff08;相当于动态数组&#xff09; ArrayList lis…...

【C语言】 —— 预处理详解(下)

【C语言】 —— 预处理详解&#xff08;下&#xff09; 前言七、# 和 \##7.1 # 运算符7.2 ## 运算符 八、命名约定九、# u n d e f undef undef十、命令行定义十一、条件编译11.1、单分支的条件编译11.2、多分支的条件编译11.3、判断是否被定义11.4、嵌套指令 十二、头文件的包…...

Jupyter Notebook简介

Jupyter Notebook是一个开源的Web应用程序&#xff0c;允许你创建和共享包含实时代码、方程、可视化和解释性文本的文档。它广泛用于数据清理和转换、数值模拟、统计建模、机器学习等领域。 Jupyter Notebook的优势包括&#xff1a; 1. **交互式计算**&#xff1a;可以在网页…...

ChatGPT 5.0:一年后的猜想

对于ChatGPT 5.0在未来一年半后的展望与看法&#xff0c;我们可以从以下几个方面进行详细探讨&#xff1a; 一、技术提升与功能拓展 语言翻译能力&#xff1a; ChatGPT 5.0在语言翻译方面有望实现更大突破。据推测&#xff0c;新版本将利用更先进的自然语言处理技术和深度学习…...

Java套红:指定位置合并文档-NiceXWPFDocument

需求&#xff1a;做个公文系统&#xff0c;需要将正文文档在某个节点点击套红按钮&#xff0c;实现文档套红 试了很多方法&#xff0c;大多数网上能查到但是实际代码不能找到关键方法&#xff0c;可能是跟包的版本有关系&#xff0c;下面记录能用的这个。 一&#xff1a;添加依…...

【操作系统】进程管理——进程的同步与互斥(个人笔记)

学习日期&#xff1a;2024.7.8 内容摘要&#xff1a;进程同步/互斥的概念和意义&#xff0c;基于软/硬件的实现方法 进程同步与互斥的概念和意义 为什么要有进程同步机制&#xff1f; 回顾&#xff1a;在《进程管理》第一章中&#xff0c;我们学习了进程具有异步性的特征&am…...

Qt:13.多元素控件(QLinstWidget-用于显示项目列表的窗口部件、QTableWidget- 用于显示二维数据表)

目录 一、QLinstWidget-用于显示项目列表的窗口部件&#xff1a; 1.1QLinstWidget介绍&#xff1a; 1.2属性介绍&#xff1a; 1.3常用方法介绍&#xff1a; 1.4信号介绍&#xff1a; 1.5实例演示&#xff1a; 二、QTableWidget- 用于显示二维数据表&#xff1a; 2.1QTabl…...

恢复出厂设置手机变成砖

上周&#xff0c;许多Google Pixel 6&#xff08;6、6a、6 Pro&#xff09;手机用户在恢复出厂设置后都面临着设备冻结的问题。 用户说他们在下载过程中遇到了丢失 tune2fs 文件的错误 。 这会导致屏幕显示以下消息&#xff1a;“Android 系统无法启动。您的数据可能会被损坏…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...