静态扫描工具(如PHPCompatibility)可快速定位PHP 8.3已移除的危险函数(如create_function、mysql_query),结合人工检查注入模式、AST调用链追踪及运行时日志验证,实现全面安全加固。

直接用静态扫描工具定位危险函数调用,比人工逐行翻代码快得多,也更可靠。
用 PHPCompatibility 扫描废弃与高危函数
PHP 8.3 已移除或严格限制一批存在安全隐患的函数,比如 create_function()(远程代码执行风险)、mysql_query()(SQL 注入温床)、ereg()、split()、each() 等。这些不是“不推荐”,而是根本不能运行或已被标记为废弃。
- 安装并运行:
phpcbf --standard=PHPCompatibility --runtime-set testVersion 8.3 . - 它会标出所有不兼容调用,包括动态函数名拼接、未声明的动态属性、被删函数的残留使用
- 重点盯
create_function—— 官方已彻底删除,任何出现都必须替换为匿名函数
手动检查常见注入型危险函数组合
有些函数本身合法,但搭配不当就是漏洞入口。扫描工具不一定能识别语义风险,需人工聚焦以下模式:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
-
$_GET/$_POST/$_REQUEST直接进eval()、assert()、system()、exec()、passthru() - 字符串拼接 SQL:如
"SELECT * FROM user WHERE id = " . $_GET['id'],尤其出现在mysql_*或裸mysqli_query()中 - 未经转义输出到 HTML:
echo $_GET['q'];或print $title;出现在未过滤上下文
结合 AST 分析做深度调用链追踪
单纯找函数名容易漏掉间接调用。例如一个封装函数 run_sql($sql) 内部调用了 mysqli_query(),而调用方又把用户输入塞进去——这种链式风险需结构化分析。
立即学习“PHP免费学习笔记(深入)”;
- 可用 PHP-Parser(nikic/php-parser)写脚本提取所有函数调用节点,再向上追溯参数来源
- 重点关注参数是否来自超全局数组、文件读取、数据库查询结果、外部 API 返回值
- 对
eval、assert、unserialize类函数,强制要求其参数必须是字面量或白名单内常量
运行时日志辅助验证
静态扫描可能漏掉条件分支里的危险调用。开启完整错误与警告日志,配合最小化触发路径,可暴露隐藏调用:
- 在
php.ini中设:error_reporting = E_ALL | E_STRICT,display_errors = On,log_errors = On - 访问典型功能路径(如搜索页、用户中心、后台导出),观察错误日志是否爆出
Deprecated: Function mysql_query() is deprecated或Warning: assert(): Calling assert() with a string argument is deprecated - 这类日志既是兼容性提示,也是危险函数仍在活动的证据


















