PHP4.4.2中关于BASE64编码中的一点BUG

PHP将远程图片加密成base64编码 PHP将远程图片加密成base64编码 解析:PHP代码实现将远程图片下载到本地,在载入图片进行base64编码。 例一:代码将图片保存为1.jpg,多次执行会覆盖此图片。 <?php $url="https://mgtk.suyuan1688.com/col/9/cs30.jpg"; $new_file = "./"."1.jpg"; //图片类型getimagesize($url)可... 阅读详情

今天偶然调试时,发现了base64编码时内存分配的BUG,为编码分配的缓冲区计算方式有隐患,偶尔出现缓冲区过小,导致后续堆内存被覆盖,访问越界.

php-4.4.2/ext/standard/base64.c

/* {{{ php_base64_encode */
PHPAPI unsigned char *php_base64_encode(const unsigned char *str, int length, int *ret_length)
{
 const unsigned char *current = str;
 unsigned char *p;
 unsigned char *result;

 if ((length + 2) < 0 || ((length + 2) / 3) >= (1 << (sizeof(int) * 8 - 2))) {
  if (ret_length != NULL) {
   *ret_length = 0;
  }
  return NULL;
 }

 result = (unsigned char *)safe_emalloc(((length + 2) / 3) * 4, sizeof(char), 1);
 p = result;

 while (length > 2) { /* keep going until we have less than 24 bits */
  *p++ = base64_table[current[0] >> 2];
  *p++ = base64_table[((current[0] & 0x03) << 4) + (current[1] >> 4)];
  *p++ = base64_table[((current[1] & 0x0f) << 2) + (current[2] >> 6)];
  *p++ = base64_table[current[2] & 0x3f];

  current += 3;
  length -= 3; /* we just handle 3 octets of data */
 }

 /* now deal with the tail end of things */
 if (length != 0) {
  *p++ = base64_table[current[0] >> 2];
  if (length > 1) {
   *p++ = base64_table[((current[0] & 0x03) << 4) + (current[1] >> 4)];
   *p++ = base64_table[(current[1] & 0x0f) << 2];
   *p++ = base64_pad;
  } else {
   *p++ = base64_table[(current[0] & 0x03) << 4];
   *p++ = base64_pad;
   *p++ = base64_pad;
  }
 }
 if (ret_length != NULL) {
  *ret_length = (int)(p - result);
 }
 *p = '/0';
 return result;
} 

我觉得计算方式应改为如下:

 /* Account the result buffer size and alloc the memory for it. */
 if ((length % 3) != 0)
 {
  padnum = 3 - length % 3;
 }

 retsize = (length + padnum) + ((length + padnum) / 3) + 1; // 正确的大小
稍微解释一下,因为BASE64需要将3个8位字节转换成4个6位的元组,4个6位元组每一组都可以用编码表中的一个ASCII码表示,这样的话,即就是每3个字节会多出一个字节,所以最终编码应该多出((length + padnum) / 3)个. 原理就是如此,而standard中默认的编码内存分配计算得有隐患.

PHP实现Base64编码解码类的详细教程 在自定义Base64编解码类时,我们需要首先定义类的基本结构,包括它的属性和方法。以下是一个简化版的Base64类的结构设计:// 将输入数据编码成Base64字符串// 将Base64字符串解码回原始数据// 内部使用的方法,处理数据分组的编码// 内部使用的方法,处理数据分组的解码// 更多辅助方法可以在这里定义,例如错误处理等。 阅读详情

相关推荐

PHP与JS中的Base64与URI编码解码技术应用

URI(Uniform Resource Identifier,统一资源标识符)编码是将字符转换为字节序列的过程,这些字节序列可以通过特定的编码方式以URL的形式传输。URI编码主要用于URL中,因为URL中只能包含ASCII字符集中的字符,当URL需要包含非ASCII字符或特殊字符(如空格、标点符号)时,这些字符必须被编码。这可以避免在URL解析过程中的歧义,确保URL的正确传输和使用。URI编码的主要应用场景包括:- 在URL查询参数中传递数据时,如?name=张三。

weixin_42668301的博客 761

base64 加号 php,php函数base64_encode后的参数包含加号解析出错的解决方案

在进入主题之前我们先来看这样如下代码,test.php$url = "test2.php?name=".base64_encode('用来做测试的字符串')."&age=23";header("Location:$url");test2.phpvar_dump(base64_decode($_GET['name']));die();访问http://localhost/test.php地址...

weixin_35888209的博客 264

软件测试 | 手把手教你如何使用 Charles 抓包工具(电脑+手机端)

软件测试 | 手把手教你如何使用 Charles 抓包工具(电脑+手机端)一、Charles简介二、Charles下载与安装三、Charles配置(1)Charles-PC端的配置如下:(2)过滤网络请求:(3)Charles抓取HTTPS请求包前置条件:(4)Charles抓取HTTPS双向认证包:关注我,免费领取学习资料 嘿。大家好,我是4U: 做过 APP 测试的同学都会接触抓包工具,通过抓包工具可以获取到客户端与服务端接口的交互数据,在实际测试APP的过程中,我们往往会发现服务端返回 的参数字段错

leboxy的博客 4153

对签名串做BASE64编码和解码、验签,验签失败的原因

1、首选看 代码片段String rtnVal = this.getTreeMap(map1); //排序后的字符串 String checkSign = signTime + "|" + rtnVal; System.out.println("待加签"+checkSign); //String signature = MyRSASign.addSign(checkSign, "cg.privat...

beauty_魅影 5978

5G核心网NAS消息解析:从协议字段到实际抓包分析(附Wireshark示例)

本文深入解析5G核心网NAS消息的实战分析方法,从协议字段解读到实际Wireshark抓包诊断。通过详解扩展协议鉴别器、安全头类型、流程事务标识等核心字段,并结合注册流程故障排查实例,指导工程师快速定位NAS层问题,提升5G网络调试与协议分析效率。

grass的博客 532

RTX4090上跑CenterNet训练

参考实现 url=https://github.com/xingyizhou/CenterNet.git commit_id=5b1a490a52da57d3580e80b8bb4bbead9ef2af96

遗失的神庙 1622

php java sha256withrsa 验签问题_Thinkphp网站支付宝异步回调验签失败问题

手头一个项目,用到了支付宝手机网站支付,项目用tp做的,下载支付宝SDK后修改后调起正常,同步接口也可访问,但异步接口验签总是错误失败,fail,追踪到AopClient.php的580行,下段代码处if ("RSA2" == $signType) { $result = (bool) openssl_verify($data, base64_decode($sign), $res, OPE...

weixin_34355933的博客 542

投研必备工具:Wind(万得)数据库快速入门

Wind数据库对于金融从业者来说是必不可少的一个软件,本文主要介绍了股票和债券的信息查找,帮助后续对数据进行分析,开始学习吧!

weixin_56581108的博客 10万+

记录一次对XML文件数字签名Base64转码时遇到的坑

前些天,公司业务需要对XML格式的文件做数字签名,签完名后发去网联的联调环境却一直返回文件验签失败,一直改加密的代码和找同事帮忙都没解决。后来,无意间看到了一条有关base64加密的博客,尝试着试了一下,没想到就是base64加密的问题。 我的代码中将字节数组base64转码用的一直是这个方法Base64.encodeBase64String(sa.sign()),原来base64转码到一定的长度...

weixin_44042579的博客 1172

大数据与宠物:健康监测数据分析

随着全球宠物市场规模的快速增长(2023年全球宠物产业规模已达3500亿美元),宠物健康管理需求呈现指数级上升。传统宠物医疗依赖定期体检和症状观察,存在滞后性和主观性缺陷。本文聚焦如何通过物联网(IoT)设备采集宠物生理数据(体温、心率、活动量等),利用大数据分析技术构建实时健康监测系统,实现宠物健康状态的动态评估、异常预警和疾病预测。研究范围涵盖数据采集技术、数据预处理方法、机器学习模型构建及实际应用场景落地。背景介绍:明确研究目的、目标读者及核心术语核心概念与联系。

2502_91592937的博客 1067

STM32智能小车控制舵机转向

文章目录前言一、舵机简单介绍及接线方式二、cubeMX配置三、代码解析总结 前言 本文将带大家学习如何驱动舵机转向 一、舵机简单介绍及接线方式 信号线(黄线)红线(电源线)棕色(地线) 舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的: 0.5ms--------------0度; 1.0ms------------45度; 1.5ms------------90度; 2

m0_49476241的博客 8613

标准的Base64算法描述

作者:zhanhailiang 日期:2014-12-19 算法描述: Base64要求把每三个8Bit的字节转换为四个6Bit的字节(38 = 46 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。 第一个字符通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一个目标

香巴拉 1956

PVE虚拟机运行不流畅,出现卡顿。

🏆本文收录于《优快云问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 3063

PHP实现图片base64编码与解码

PHP有内置的base64_encode与base64_decode负责进行Base64编码与解码。 一.图片base64编码 只要将图片流读取到,而后使用base64_encode进行进行编码然后拼接上前缀(data:image/png;base64,)即可。 /** * 图片base64编码 * @param string $img * @param bool $imgHtmlCo...

江南极客 1万+

Docker:快速部署 Temporal 工作流引擎的技术指南

Temporal是一个开源的分布式工作流引擎,适用于复杂业务流程(如订单处理、支付流程等),提供状态持久化、自动重试、多语言SDK支持等特性。部署简单,支持Docker Compose,包含核心服务、Web UI及数据库。以TypeScript为例,开发者可快速编写工作流(如订单处理)和Worker,通过CLI或SDK启动和管理。Temporal简化了分布式系统的可靠性设计,适合电商、自动化任务等场景。

木头 640

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

base64编码_Base64编码详解

来源 | 公众号 架构师必备Base64编码原理Base64编码之所以称为Base64,是因为其使用64个字符来对任意数据进行编码,同理有Base32、Base16编码。标准Base64编码使用的64个字符为:这64个字符是各种字符编码(比如ASCII编码)所使用字符的子集,基本,并且可打印。唯一有点特殊的是最后两个字符,因对最后两个字符的选择不同,Base64编码又有很多变种,...

weixin_39621185的博客 2181

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

php base64 utf8,php和js中,utf-8编码转成base64编码

1、php下转化base64编码php中,文本文件的编码决定了程序变量的编码,比如以下代码在不同编码的php文件中,展示的效果也是不一样的$word = '严';echo base64_encode($word);?>如果文本文件是utf-8,则输出结果为:5Lil,而在gbk文件中的输出结果是:0c8=注意:php中转换成base64编码时,和网页编码没有关系。2、js下转化base64编...

weixin_32236415的博客 994

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

php 解析base64,Base64编码原理分析与PHP实现

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个为一个单元,对应某个可打印字符。三个bites有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。如在mime(多用...

weixin_30314045的博客 854

php 图片 base64编码相互转换

//Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。 //Base64编码包含26个大写字母 26个小写字母 10个数字和 加号+ 斜线 / //图片转base64编码字符串 $img = 'images/2.jpg'; $img_content = file_get_contents($img); $...

repoman的博客 1293

PHP保存base64编码图片,图片有一部分是灰色块儿,原因和解决办法

PHP保存前端传输过来的图片base64数据不完整的解决方法

Clarkbrave的博客 1795

Base64编码

根据RFC822规定,BASE64Encoder编码每76个字符,还需要加上一个回车换行。 谷歌了一下,原来是RFC2045中有规定: The encoded output stream must be represented in lines of no more than 76 characters each. Base64一行不能超过76字符,超过则添加回车换行符。 所谓Base64,就是说选出64个字符----小写字母a-z、大写字母A-Z、数字0-9、符号"+"、"/"(再加上作为垫.

EmbeddedCoder 的优快云博客 1766

php将图片转成base64编码,利用PHP将图片转换成base64编码的实现方法

利用PHP将图片转换成base64编码的实现方法先来说一下为什么我们要对图片base64编码base64是当前网络上最为常见的传输8Bit字节代码的编码方式其中之一。base64主要不是加密,它主要的用途是把某些二进制数转成普通字符用于网络传输。由于这些二进制字符在传输协议中属于控制字符,不能直接传送,所以需要转换一下。虽然图片可能直接传输,但是我们也可以将它变成字符串直接放在源码里,而不需要浏览...

weixin_35986497的博客 1095

php实现base64编码

工作需要,想弄一个加密的串,就想仿照base64的编码方式,写一个加密的方法,所以就有了下面这个用php实现的base64的代码 <?php /** * Base64 编码/解码 * @author liruixing */ class Base64{ private $_base64hash = 'ABCDEFGHIJKLMNOPQRSTUVWXY...

423

php base64 4648,Base64 编码

Base64,是一种二进制数据转换为可打印字符的编码。用于一些不支持二进制数据的场景。比如常见的 HTTP 、SMTP 协议是文本协议,其中要传递一些二进制的数据(如:AES算法加密后的数据)时就需要把其转换为文本形式的字符串。Base64编码后的数据有2个特性,其一是文本字符串,其二是这些字符还是可打印的。二进制转换为普通文本的编码,英文称为:Binary-to-text encoding。也是...

weixin_34769715的博客 686

Base64编码解码原理详解

Base64编码解码原理详解1. Base64字符的组成部分 Base64所用字符: 0,1,2 ….9 A,B,C,D…Z a,b,c,d…z + / 对应ASCII: 48,49…58,65,66…90,97,98…122, 43,47 2. 10个数字,26个大写字母,26个小写字母,1个+,一个 / 刚好64个字符3. Base64是将每3个字符转化为4个字符,即(3*8bit

小龙 2万+

php和js中,utf-8编码转成base64编码

1、php下转化base64编码 php中,文本文件的编码决定了程序变量的编码,比如以下代码在不同编码的php文件中,展示的效果也是不一样的 <?php $word = '严'; echo base64_encode($word); ?> 如果文本文件是utf-8,则输出结果为:5Lil,而在gbk文件中的输出结果是:0c8= 注意:ph...

daxiaojianghujs2016的博客 254
上一篇: 发现一个EVC编译器对自增算符处理时的隐患
下一篇: 如何去爱一个人[转]
皮鲁
博客等级 码龄23年 44粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值