
PHP代码里的3颗安全地雷PHPSA如何静态检测eval、不安全unserialize与DoS隐患【免费下载链接】phpsaSmart/Static Analyzer(sis) for PHP :bowtie::neckbeard:项目地址: https://gitcode.com/gh_mirrors/ph/phpsaPHPSAPHP Smart/Static Analyzer是一款面向 PHP 的静态分析工具它不需要运行代码就能在语法树上直接扫描出eval()、不安全的unserialize()以及sleep函数引发的 DoS 隐患。这篇文章带你从 3 颗最典型的安全地雷入手快速了解 PHPSA 是如何在编码阶段就把雷排掉的 为什么PHP静态分析能提前排雷传统测试要等代码跑起来才能发现问题而 PHPSA 的静态检测是在不执行代码的前提下把 PHP 源码解析成抽象语法树再逐条规则检查其中的危险写法。它由四大组件构成核心定义、编译器、分析器和控制流分析其中真正抓虫子的是分析器Analyzer组件。每条规则产出的报告都带有规则 ID例如Notice: Using eval is discouraged. in app/Widget.php on 12 [eval_usage]看到规则 ID就能反查到对应的检测逻辑源码可解释性很强 第一颗地雷eval() 为什么会被 PHPSA 标记eval()会把字符串当作 PHP 代码执行。一旦传入的内容来自用户输入、配置文件甚至日志文件攻击者就能借此注入任意代码——这是典型的远程代码执行RCE入口。PHPSA 的eval_usage规则会拦截源码中所有eval()调用并提示 Using eval is discouraged.。这条规则的源码非常短小精悍核心逻辑在src/Analyzer/Pass/Expression/EvalUsage.php规则描述写得很直接Discourages the use of eval()。换句话说只要代码里出现 evalPHPSA 就会报告不给特殊情况留后门。第二颗地雷不安全的 unserialize() 与对象注入unserialize()的反序列化如果没有限制可实例化的类攻击者可以构造恶意序列化字符串让 PHP 实例化任意类并触发其魔法方法如__destruct、__wakeup最终演变成对象注入 / 远程代码执行。PHP 7.0 为unserialize()提供了第二个参数allowed_classes用于白名单限制可反序列化的类。PHPSA 的unsafe.unserialize规则会检查只传 1 个参数的unserialize()→ 报告 unserialize() should be used with a list of allowed classes or false as 2nd parameter.显式传了白名单或false→ 放行 ✅规则源码位于src/Analyzer/Pass/Expression/FunctionCall/UnsafeUnserialize.php该规则在元数据中声明了setRequiredPhpVersion(7.0)即只有当项目最低 PHP 版本 ≥ 7.0 时才会启用——对老项目不会误报。第三颗地雷sleep 家族函数引发的DoS隐患第三颗雷更隐蔽sleep()、usleep()、time_nanosleep()、time_sleep_until()这类睡眠函数。如果延时参数直接来自用户输入比如sleep($_GET[delay])攻击者只需请求一次就能让一个 Worker 进程长时间挂起批量请求即可造成拒绝服务DoS。PHPSA 的sleep.usage规则内置了一张函数映射表命中其中任何一个函数就会报告Function sleep() can cause a denial of service vulnerability.规则源码位于src/Analyzer/Pass/Expression/FunctionCall/SleepUsage.php附加彩蛋PHPSA 还会顺路检查除以 0这类运行时炸弹比如能编译期算出1000 / ((5*5)-25)这种恒为零的除数报告 ID 为division-zero对应示例代码见fixtures/simple/code-smell/DivisionZero.php。快速上手3 步运行 PHPSA 静态检测第 1 步安装推荐通过 Composer 安装composer require ovr/phpsa也可以从源码获取git clone https://gitcode.com/gh_mirrors/ph/phpsa cd phpsa第 2 步执行检测./bin/phpsa check src/check命令会对路径下所有文件运行编译器和分析器。官方推荐关闭 xdebug 以提升速度php -n -d xdebug.enable0 -f ./bin/phpsa。第 3 步阅读报告每条结果都包含文件 行号 规则ID 出错代码片段例如Notice: Function sleep() can cause a denial of service vulnerability. in api/callback.php on 42 [sleep.usage]如果想按需关闭某条规则可以在项目根目录的.phpsa.yml中配置配置方法参见docs/03_Configuration.md各规则清单完整说明见docs/05_Analyzers.md。这三颗地雷的规则源码在哪里看想深入理解检测逻辑直接打开对应文件即可全部都很轻量eval 检测src/Analyzer/Pass/Expression/EvalUsage.php不安全 unserialize 检测src/Analyzer/Pass/Expression/FunctionCall/UnsafeUnserialize.phpsleep / DoS 检测src/Analyzer/Pass/Expression/FunctionCall/SleepUsage.php规则总览文档docs/05_Analyzers.md使用与示例输出docs/02_Usage.md小结地雷风险PHPSA 规则 IDeval()远程代码执行eval_usageunserialize()无白名单对象注入unsafe.unserializesleep()家族函数拒绝服务 DoSsleep.usage静态安全检测的价值在于左移把漏洞拦在提交代码之前。PHPSA 规则透明、源码可读、可按配置裁剪适合作为 PHP 项目的 CI 第一道安检 ️ 跑一次check看看你的代码里埋了几颗雷吧。【免费下载链接】phpsaSmart/Static Analyzer(sis) for PHP :bowtie::neckbeard:项目地址: https://gitcode.com/gh_mirrors/ph/phpsa创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考