关于PHP二进制安全的解释

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于PHP二进制安全的解释相关的知识,希望对你有一定的参考价值。

解释一:

  php里,有string的概念。

  string里,每个字符的大小为byte(与PHP相比,Java的每个字符为Character,是UTF8字符,C语言的每个字符可以在编译时选择)。
byte里,有ASCII代码的字符,例如ABC,123,abc,也有一些特殊字符,例如回车,退格之类的。
特殊字符很多是不能显示的。或者说,他们的显示方式没有标准,例如编码65到哪儿都是字母A,编码97到哪儿都是字符a,退格在有的地方显示成一个符号,在有的地方就会真的把前一个字符退掉。
  PHP以C为基础,所以很多描述都是以C为对比。C的字符串里,一种经典的定义就是,以编码0作为字符串的结尾。那么,假设这样一个string,里面3个字符的编码分别是97,0,97。那么,C里面如果有str_replace等效的函数, 利用它把97换成98,那么这个函数读取到0的时候,就认为已经结束了,就会得到98,0,97。跟它对应的,PHP里的str_replace是二进制安全的,那么这个0不会被视为特殊的结束符号,于是结果就是98,0,98。
  【二进制安全】在PHP文档里,基本就是这么一个意思:C语言里的功能类似的函数会对有的字符特别处理,而PHP这个函数对于所有字符一视同仁,不用担心会有特殊字符影响处理,特别不用担心编码0字符。


解释二:
  c中的strlen函数就不算是binary safe的,因为它依赖于特殊的字符‘\0‘来判断字符串是否结束,
所以对于字符串str = "1234\0123"来说,strlen(str)=4
  而在php中,strlen函数是binary safe的,因为它不会对任何字符(包括‘\0‘)进行特殊解释,
所以在php中,strlen(str)=8
  所以,我理解的二进制安全的意思是:只关心二进制化的字符串,不关心具体格式,
只会严格的按照二进制的数据存取。不会妄图已某种特殊格式解析数据。

以上是关于关于PHP二进制安全的解释的主要内容,如果未能解决你的问题,请参考以下文章

哪些函数 PHP 被认为不是“二进制安全的”?这些“非二进制安全”函数将字符串传递给哪些库?为啥?

如何成为一个高质量hacker?谈谈我的二进制安全学习路线

将二进制数据传递给非二进制安全函数都有哪些安全隐患?

2019-2020-1学期20192401《网络空间安全专业导论》第一周学习总结

20191206《信息安全专业导论》第三周学习总结

二进制安全:经典栈溢出(stack_example)实战