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

相關文章
相關標籤/搜索