php - 哪些函数 PHP 被认为不是“二进制安全的”?这些“非二进制安全”函数将字符串传递给哪些库?为什么?
问题描述
我正在使用Windows 10 Home Single Language Edition,它是我机器上的64 位操作系统。
我已经安装了最新版本的XAMPP ,它在我的机器上安装了PHP 7.2.7 。
我是根据摘自PHP Manual的摘录来问这个问题的:
PHP 中的字符串被实现为一个字节数组和一个指示缓冲区长度的整数。它没有关于这些字节如何转换为字符的信息,将任务留给程序员。字符串可以包含的值没有限制;特别是,值 0 的字节(“NUL 字节”)允许在字符串中的任何位置(但是,一些函数,在本手册中说不是“二进制安全的”,可能会将字符串移交给忽略数据后的库NUL 字节。)
我非常了解 PHP 中二进制安全函数和非二进制安全函数之间的区别。我一直在心里怀疑。请用适当的解释和适当的例子一一回答。
- PHP 中出现“非二进制安全”和“二进制安全”函数的现象仅仅是因为整个 PHP 解析器是用C 语言编写的吗?
- 在处理包含任何值(包括 NUL 字节)的字符串时,C 和 PHP 有什么区别?
- 我想要 PHP 中“非二进制安全”和“二进制安全”的函数的完整列表。
- “非二进制安全”和“二进制安全”的特性是否仅适用于对字符串进行操作的函数,而不适用于处理 PHP 中其他类型的 PHP 函数?
- 为什么非二进制安全函数将字符串交给库?
- 非二进制安全函数是否仅在它们处理的字符串包含 NUL 字节时才将字符串传递给库?
- 这些“非二进制安全”函数将字符串传递给哪些库?
- 这些库如何处理从“非二进制安全”函数接收到的字符串?
- 在将包含 NUL 字节的字符串移交给某个库之后,“非二进制安全”函数是否像“二进制安全”函数一样工作?
解决方案
就像 arkascha 解释的那样,“二进制安全”和“非二进制安全”的问题与语言无关。
使用空字节 (0x00) 来指示字符串的结尾更简单(这可能是 C 使用它的原因),但缺点是字符串中的任何地方都不能有空字节,如果你这样做,这是一个很大的限制必须能够处理各种数据。将长度存储为字符串的元数据部分更为复杂,如 Pete 所示,但它允许您处理任何类型的数据。
关于哪些函数是“二进制安全”或“非二进制安全”的,请在使用这些函数之前阅读 PHP 手册。我就是做这个的。无需构建列表,因为 PHP 手册已经解释了您需要了解的有关函数的内容,包括它们是否是二进制安全的。
我相信您的大部分帖子是由于对您引用的 PHP 手册的解释的误解,特别是这部分:
但是,本手册中提到的一些函数不是“二进制安全的”,可能会将字符串移交给忽略 NUL 字节后数据的库。
让我尝试通过添加一些我自己的话使其更清楚:
但是,本手册中提到的一些函数不是“二进制安全的”,它们可能会将字符串移交给忽略 NUL 字节后数据的库。
所以它真的没有说“非二进制安全函数将字符串交给库”,这是一种误解。它的意思是“可能将字符串传递给在 NUL 字节后忽略数据的库的函数,在本手册中被称为不是二进制安全的”。
“移交给库”只是“从其他库调用函数”的另一种说法。“在 NUL 字节后忽略数据”是一种称为非二进制安全的行为。
另一种说法是:
本手册中的一些函数被称为不是“二进制安全的” ,因为它们可能会调用其他也不是“二进制安全”的函数(忽略 NUL 字节后数据的函数)。
我希望这可以为您解决问题。
推荐阅读
- c - 如何从目标文件转储到源的路径
- informix - 在 informix 中创建触发器以生成随机字母数字字符串
- ruby-on-rails - 如何从 Rails 应用程序的数据库配置文件中获取全局变量?
- sql - JPA 序列 id 增量与直接 DB 插入 id 增量
- javascript - 存根推送器(事件)Javascript
- android - 如何使用service获取打开了哪个app的信息?
- php - 在 Laravel 5 中使用 get()
- python - 如何在不规则物体内部生成随机点和格点?
- .net-core - grpc .net-core 应用程序在本地外部不可见
- node.js - createReadStream() 如何在 aws-sdk 中工作?