PHP8.5 的新 URI 扩展
URL 是我们每天依赖的 Web 的基础构建块。
它们的熟悉度让它们看起来简单得有些欺骗性:看似清晰划分的组件,如 scheme、hostname、path 等,让人觉得从 URL 中提取信息是件小事。但实际上,多年来已经构建了数千个自定义解析器,每个都有自己对细节的理解。
对我们 Web 开发者来说,有两个主要标准规定了 URL 应该如何工作。RFC 3986,这是 2005 年的原始 URI 标准;以及 WHATWG URL Living Standard,Web 浏览器遵循的标准。因为事情并不像乍看起来那么简单,这两个常用标准彼此不兼容!混合使用不同的标准及其解析器,特别是当它们没有完全遵循标准时,通常会导致安全问题。
原文链接 PHP8.5 的新 URI 扩展
为什么需要改变
尽管正确解析 URL 很重要,但 PHP 长期以来在标准库中并没有包含任何符合标准的解析器。虽然有 parse_url() 函数,它从 PHP 4 就存在了,但它不遵循任何标准,并且在文档中明确说明不要用于不受信任或格式错误的 URL。尽管如此,由于缺乏更好的替代方案,而且它对开发者日常工作中遇到的大多数格式良好的输入似乎都能正常工作,所以它被广泛使用。这可能会误导开发者认为 parse_url() 的安全问题纯粹是理论问题,而不是迟早会导致问题的东西。
举个例子,输入 URL example.com/example/:8080/foo 根据 RFC 3986 是一个有效的 URL,仅由相对路径组成。如果不针对基础 URL 解析,根据 WHATWG URL 标准它是无效的。然而,根据 parse_url() 的解析,它是主机为 example.com、端口为 8080、路径为 /example/:8080/foo 的 URL,因此在两个结果组件中都包含了 8080:
[code] |