首页  >  文章  >  后端开发  >  Php二进制安全详解

Php二进制安全详解

小云云
小云云原创
2018-03-29 15:45:131901浏览

本文主要和大家分享Php二进制安全详解,希望能帮助到大家。

1. php的二进制安全 binary-safe

php的内部函数在操作二进制数据时能保证达到预期的结果,例如 str_replacestristrstrcmp 等函数,我们就说这些函数是二进制安全的。

下面通过 c 语言 和  php 的对比 来看 他们对二进制数据的处理
#include "stdio.h"#include "string.h"int main(){char a[] = "aa\0b";char b[] = "aa\0c";printf("%d\n", strcmp(a, b));printf("%ld\n", strlen(a));
}/* 0 2 */
可以看出来 c语言  "\0" 是字符串结束,所以认为 "aa\0b'"aa\0c" 是一样的,长度为2 抛弃了 "\0b""\0c" .
php "aa\0b" 和  "aa\0c" 是不同的 ,并且长度为4

2. php实现二进制安全的原理

PHP中字符串通过 zend_string 表示:
这里写图片描述

PHP中 变量   zend_value 表示:
这里写图片描述

  • gc: 变量引用信息,比如当前value的引用数,所有用到引用计数的变量类型都会有这个结构,3.1节会详细分析

  • h: 哈希值,数组中计算索引时会用到

  • len: 字符串长度,通过这个值保证二进制安全

  • val: 字符串内容,变长struct,分配时按len长度申请内存


  • len: 字符串长度,通过这个值保证二进制安全 ,它不需要像C 一样用哟   ‘\0’ 结尾符来判断字符串的结束,而是通过len

3.SDS

C   : 以 ’\0’ 为结束符,所以c的字符串不能包含文本,图片、音频、视频、压缩文件这样的二进制数据。
Php : 记录 len  
SDS : simple dynamic string 简单动态字符串的抽象类型,应用到字符表示:

SDS 数据结构:

struct sdshdr {    # 记录 buf 数组中已使用字节的数量
    # 等于 SDS 所保存字符串的长度
    int len;    # 记录 buf 数组中未使用字节的数量
    int free;    # 字节数组,用于保存字符串
    char buf[];
};

redis 的结构定义中也记录了SDS所保存字符串的长度,通过这个值保证二进制安全,SDS 的 API 都会用 字符串的len 属性来判断字符串是否结束

1. php的二进制安全 binary-safe

php的内部函数在操作二进制数据时能保证达到预期的结果,例如 str_replacestristrstrcmp 等函数,我们就说这些函数是二进制安全的。

下面通过 c 语言 和  php 的对比 来看 他们对二进制数据的处理
#include "stdio.h"#include "string.h"int main(){char a[] = "aa\0b";char b[] = "aa\0c";printf("%d\n", strcmp(a, b));printf("%ld\n", strlen(a));
}/* 0 2 */
可以看出来 c语言  "\0" 是字符串结束,所以认为 "aa\0b'"aa\0c" 是一样的,长度为2 抛弃了 "\0b""\0c" .
php "aa\0b" 和  "aa\0c" 是不同的 ,并且长度为4

2. php实现二进制安全的原理

PHP中字符串通过 zend_string 表示:
这里写图片描述

PHP中 变量   zend_value 表示:
这里写图片描述

  • gc: 变量引用信息,比如当前value的引用数,所有用到引用计数的变量类型都会有这个结构,3.1节会详细分析

  • h: 哈希值,数组中计算索引时会用到

  • len: 字符串长度,通过这个值保证二进制安全

  • val: 字符串内容,变长struct,分配时按len长度申请内存


  • len: 字符串长度,通过这个值保证二进制安全 ,它不需要像C 一样用哟   ‘\0’ 结尾符来判断字符串的结束,而是通过len

3.SDS

C   : 以 ’\0’ 为结束符,所以c的字符串不能包含文本,图片、音频、视频、压缩文件这样的二进制数据。
Php : 记录 len  
SDS : simple dynamic string 简单动态字符串的抽象类型,应用到字符表示:

SDS 数据结构:

struct sdshdr {    # 记录 buf 数组中已使用字节的数量
    # 等于 SDS 所保存字符串的长度
    int len;    # 记录 buf 数组中未使用字节的数量
    int free;    # 字节数组,用于保存字符串
    char buf[];
};

redis 的结构定义中也记录了SDS所保存字符串的长度,通过这个值保证二进制安全,SDS 的 API 都会用 字符串的len 属性来判断字符串是否结束。

相关推荐:

php二进制安全的含义

php的二进制安全_PHP教程

PHP函数二进制安全有关问题

以上是Php二进制安全详解的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn