PHP代码审计应聚焦用户输入的数据流,从入口点(如$_GET、$_SERVER等)出发追踪至敏感函数(如eval、mysqli_query),验证过滤逻辑有效性,并借助工具辅助但须人工确认。

发现常见漏洞,关键不是大海捞针,而是顺着数据流找“没设防的路口”。PHP代码审计不是通读全部,而是聚焦用户输入从进来到出去的每一步,看它有没有被放行到危险操作里。
盯紧入口点:识别所有可控数据来源
用户能影响的地方就是起点。重点检查以下位置是否直接或间接接收外部输入:
- $_GET、$_POST、$_REQUEST、$_COOKIE、$_SERVER —— 尤其是 $_SERVER['HTTP_REFERER']、$_SERVER['HTTP_USER_AGENT'] 这类容易被忽略的字段
- 文件上传参数($_FILES)和临时路径
- URL路径参数(如 ThinkPHP 的 index.php/m/c/a 中的 a)、重写规则映射的变量
- 从数据库、缓存、日志文件中读取后再使用的数据(二次污染)
顺藤摸瓜:追踪敏感函数调用链
找到入口后,立刻反向或正向追踪它是否流向高危函数。常见“危险汇点”包括:
- SQL执行类:mysqli_query()、PDO::query()、Db::table()->where()(框架封装也要拆开看底层)
- 命令执行类:system()、exec()、shell_exec()、passthru()、popen()、pcntl_exec()
- 代码执行类:eval()、assert()、create_function()、preg_replace('/.*/e')(PHP7+已废弃但旧代码仍存在)
- 文件操作类:file_get_contents()、fopen()、include()、require()、file_put_contents() —— 特别注意拼接了用户输入的文件路径
- 反序列化入口:unserialize()、SessionHandlerInterface::read()、phar:// 协议触发点
验证过滤逻辑:别信“看起来处理过了”
很多漏洞藏在看似安全的代码里。要逐层确认过滤是否真正生效:
立即学习“PHP免费学习笔记(深入)”;
- 检查过滤函数是否被绕过:比如用 is_numeric() 判断数字,但传入
123abc仍返回 true;用 intval() 截断字符串,但未限制长度或类型转换上下文 - 注意大小写、编码绕过:
%00截断、%20绕过空格过滤、UTF-8 双字节字符混淆正则 - 黑名单无效时很常见:比如只过滤
select,却漏掉SeLeCt或/**/select/**/ - 白名单才是可靠方案:例如文件上传只允许
['jpg', 'png'],且用 pathinfo($filename, PATHINFO_EXTENSION) 提取扩展名,再小写比对
借助工具快速定位,但必须人工确认
工具是放大器,不是替代者:
- 用 Cobra 扫描 WebShell 特征(eval + $_POST、base64_decode + gzuncompress 等组合)
- 用 Fortify SCA 做跨文件污点追踪,但报告中标红的路径需手动验证是否真可达、是否真未净化
- 用正则批量搜索:
unserialize\(|mysqli_query\(|\$\_(GET|POST|REQUEST)\[,再逐个分析上下文 - 本地搭环境跑起来,加 var_dump() 或 xdebug 断点,看变量值在每一步怎么变



















