php 二进制安全,php的二进制安全 - 范思哲思考者的个人空间 - OSCHINA - 中文开源技术交流社区...

php是以c为基础的,所以很多描述都是以c为准。c的字符串里,一种经典的定义就是,以编码0作为字符串的结尾。

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中。

$ab = "hello";

$ac = "hello\x00Hello";

var_dump(strcmp($ab, $ac));

var_dump(strlen($ab));

?>

结果依次为0,11.

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

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

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

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

4b1c8fbe1407d326c6b23ff7c4c4f82a.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值