PHP 基于 token_get_all 解析 PHP 源码,简易代码语法扫描实现

落晨小哥_5941

落晨小哥_5941

2026-10-09

512人浏览

原创

token_get_all 是 php 词法分析函数,将源码解析为 token 数组,含类型、文本、行号;适用于轻量扫描,如检测 eval、硬编码密码等,但无法处理作用域、动态拼接或混淆代码。

php 基于 token_get_all 解析 php 源码,简易代码语法扫描实现

什么是 token_get_all

token_get_all 是 PHP 内置函数,用于将一段 PHP 源代码字符串解析为“词法单元(tokens)”数组。每个 token 是一个数组,包含类型(如 T_ECHO、T_VARIABLE)、原始文本(如 '$user')和行号等信息。它不执行语法校验,也不构建 AST,仅做词法分析 —— 这让它轻量、快速,适合做基础扫描。

如何用 token_get_all 提取关键结构

常见扫描目标包括:未使用的变量、硬编码密码、危险函数调用(如 eval、system)、缺失的 isset 检查等。token_get_all 能直接定位这些关键词:

SUPAH Token Guardian
SUPAH Token Guardian

支持 21+ 条 EVM 链的盘前代币安全扫描。六层深度检测:合约安全、流动性健康度、部署者画像、持币分布、交易模式等。

下载
  • 遍历 tokens,用 is_array($token) && $token[0] === T_EVAL 判断是否含 eval
  • 检测字符串字面量:is_array($token) && $token[0] === T_CONSTANT_ENCAPSED_STRING,再用 stripos($token[1], 'password') 查敏感内容
  • 识别变量赋值:遇到 T_VARIABLE 后紧跟 T_EQUAL,可标记为“已定义变量”
  • 跳过注释与 heredoc:忽略 T_COMMENT、T_DOC_COMMENT、T_START_HEREDOC 等非执行 token

简易扫描器实现要点

写一个基础扫描器不需要框架,核心逻辑约 50 行内可完成:

  • 读取文件内容,用 file_get_contents 加载源码
  • 调用 $tokens = token_get_all($code),注意传入的字符串不能含 BOM,否则可能解析失败
  • 用 foreach ($tokens as $i => $token) 遍历,记录当前行号($token[2]),便于报错定位
  • 对每个 token 做类型判断,匹配规则后立即记录问题(如 ['line' => $token[2], 'message' => 'Found eval()'])
  • 避免误报:比如 eval 在字符串里或注释中,需结合上下文状态(如是否在 T_CONSTANT_ENCAPSED_STRING 内)过滤

局限与注意事项

token_get_all 是词法层工具,有天然边界:

  • 无法识别变量作用域(如函数内定义的变量在外部不可见),所以“未使用变量”只能做粗略提示
  • 不处理动态拼接(如 $func = 'sy'.'stem'; $func(...)),这类需静态分析或 AST
  • PHP 8+ 新增 token(如 T_NAME_QUALIFIED)需适配版本,可用 defined('T_NAME_QUALIFIED') 判断
  • 混淆代码(如 base64 编码字符串)无法识别,扫描器只看明文 token
不复杂但容易忽略

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

10244

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6041

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2095

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3808

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4494

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3531

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5037

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

3942

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

11902

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
《20天入门精通PHP》视频教程
《20天入门精通PHP》视频教程

共200课时 | 48.4万人学习

墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习