PHP7的二进制安全

PHP是如何实现二进制安全的?

前言

PHP是用C语言开发的,之所以称为解释性语言是因为不会生成可直接执行的程序,PHP代码会被Zend引擎编译成opcode, 最终作为C语言去执行的。

何为二进制安全?

程序在操作二进制数据时, 数据写入时和数据读取时是完全相同的。

c语言二进制不安全

C语言中, '\0’是字符串的结束符,当读到\0时会停止读取,所以C语言是二进制不安全的。

#include <stdio.h>

int main()
{
    char str[] = "Hello\0Hello";
    printf("%s\n", str);
    return 0;
}

这段代码会输出会截断’\0’后的字符串, 之后输出Hello。

PHP是二进制安全的

<?php
$s1 = "Hello\0s1";
$s2 = "Hello\0s2";
var_dump(strcmp($s1, $s2));

scrmp为字符串比较函数,输出-1表示这两个字符串不相等。

在php7中是如何实现二进制安全的

php7中的zend_string结构体如下:

struct _zend_string {
    zend_refcounted_h gc;
    zend_ulong        h;                /* hash value */
    size_t            len;
    char              val[1];
};

用字符数组val[]保存字符串内容,用len表示字符串长度。

由于存储了字符串的长度,那么取字符串不再用’\0’来判断字符串的末尾,而是通过长度len来取字符串的内容,所以实现了二进制安全。

发布了79 篇原创文章 · 获赞 178 · 访问量 35万+

猜你喜欢

转载自blog.csdn.net/ClassmateLin/article/details/104693692