php的二进制安全

php是以c为基础的,因此不少描述都是以c为准。c的字符串里,一种经典的定义就是,以编码0做为字符串的结尾。
php

c代码示例:安全

main(){
    char ab[] = "aa\0b";
    char ac[] = "aa\0c";
    printf("%d\n", strcmp(ab, ac));
    printf("%d\n", strlen(ab));
 }

c语言会认为ab和ac是相等的。由于在c语言中是以\0做为结尾的。编码

一样的在php中。指针

<?php
    $ab = "hello"; 
    $ac = "hello\x00Hello";
    var_dump(strcmp($ab, $ac));
    var_dump(strlen($ab));
?>

结果依次为0,11.code

strcmp是判断两个字符串是否相等非二进制安全,相等会返回0,不等则返回1.字符串

strlen是判断字符串的长度,二进制安全。class

会发现非二进制安全会误判为相等。基础

那么php是如何作到二进制安全的呢。二进制

php会根据type的值决定访问某个成员。为字符串时,php会记录val的指针和字符串的长度len,当须要进行判断时,php会直接获取到type的值不须要和c同样去判断字符串末尾的\0.
im

相关文章
相关标签/搜索