可以明确告诉你:PHP 7.4虽然已经彻底移除了register_globals,但变量覆盖漏洞可没跟着消失。问题的根源,仍然在extract()parse_str()以及手动的赋值逻辑上。

PHP7.4中如何防止全局变量被意外覆盖

直接结论:PHP 7.4 已彻底移除 register_globals,但变量覆盖漏洞仍存在,根源在 extract()parse_str() 和手动赋值逻辑

首先得明确一点:PHP 7.4 不再支持 register_globals(这个配置早在 PHP 5.4 就被废弃,5.6+ 就已经完全删除了)。所以,你不用担心因为 ini 设置错误,导致“自动注册 GET/POST 变量为全局”。但问题在于,开发者自己写的代码,依然可能触发覆盖——比如用 extract($_GET) 把用户输入直接变成变量,或者在循环中反复用 = 覆盖同名变量。

extract() 是最常被忽略的覆盖入口,必须加白名单或禁用

extract() 绝对是个高危操作,很多开发者都在它身上栽过跟头。它会把数组的键名直接转为变量名并赋值,攻击者可以借此轻松覆盖已有变量——比如 $flag$is_admin 这类关键变量。

循环内字符串累积时,=.= 的区别决定是否覆盖

这个错误相当常见,尤其是在循环里用 = 赋值,结果只保留了最后一次循环的结果:

类属性和常量要靠可见性与类型约束防覆盖,而非信任命名

PHP 7.4 支持带类型和可见性的属性声明,这是防意外覆盖的底层防线,比单纯依赖命名规范要靠谱得多:

必须警惕的是,真正难防的不是语法限制,而是开发者在“图省事”时,绕过类型检查、跳过白名单、滥用 extract(),或者在闭包里隐式捕获并修改父作用域变量——这些行为在 PHP 7.4 下依然有效,也依然危险。

本文转载于:https://www.php.cn/faq/2824537.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。