PHP4.4.2中关于BASE64编码中的一点BUG
来源:互联网 发布:诲女知之乎知的意思 编辑:程序博客网 时间:2024/05/22 16:44
今天偶然调试时,发现了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中默认的编码内存分配计算得有隐患.
- PHP4.4.2中关于BASE64编码中的一点BUG
- 关于Base64编码(转载)
- 关于Base64编码的
- 关于Base64编码
- 关于Base64编码
- 关于Base64编码
- 关于Base64编码解码
- 关于base64编码
- 关于base64编码
- 关于Base64编码
- java中的base64编码
- 关于Base64编码中的‘+’ 和‘/’字符处理
- RFC1521文档中关于QP和BASE64编码的定义
- 关于iOS中AES加密和base64编码的理解
- 关于BASE64编码的说明
- 关于Base64的编码问题
- 关于Base64编码的理解
- 关于Base64编码的理解
- 互连网的每次变革源于技术而不是一个idea
- .Net 反射
- 程序员与微波炉食谱
- 今天有买了几本书.
- Request.ServerVariables("") 的一些参数说明
- PHP4.4.2中关于BASE64编码中的一点BUG
- 基于角色访问的权限控制
- C语言之指针、数组和函数
- PHP扩展:如何使用ini变量
- 菜鸟上路!!!
- 欲善其事先利其器--Eclips使用秘技
- Struts+Spring+Hibernate练习(完整)
- mdb文件在英文系统下无法打开的问题。。。
- RS485简介