0

0

如何安全展开 PHP 中用于检测保留关键字的紧凑 token 检查逻辑

花韻仙語

花韻仙語

发布时间:2026-02-04 11:22:05

|

707人浏览过

|

来源于php中文网

原创

如何安全展开 PHP 中用于检测保留关键字的紧凑 token 检查逻辑

本文详解 `token_get_all()` 返回值结构,指出原代码中 `reset($tokens[1])` 的类型不安全问题,并提供清晰、phpstan 友好的等价展开写法,确保类型推断准确且逻辑不变。

原始代码意图明确:通过将待测字符串包裹为伪 PHP 代码(如 ),调用 token_get_all() 进行词法分析,再判断其首个实际 token(跳过 T_OPEN_TAG)是否为 T_STRING —— 若不是,则说明该字符串本身是 PHP 保留关键字(如 if、class、function 等),因为它们会被识别为对应关键字 token(如 T_IF、T_CLASS),而非普通标识符 T_STRING。

但问题出在这一行:

return reset($tokens[1]) !== T_STRING;

token_get_all() 的返回值类型是 array:多数 token 是三元数组 [token_id, token_text, line_number],而部分分隔符(如 ;、{)会以纯字符串形式返回(例如 ';')。因此 $tokens[1] 可能是数组,也可能是字符串。reset() 函数仅接受数组或对象,对字符串调用会触发运行时警告,且 PHPStan 正确地将其标记为类型错误。

更关键的是:reset($tokens[1]) 逻辑本身就有歧义。若 $tokens[1] 是数组(如 [T_IF, 'if', 1]),reset() 返回其第一个元素(即 T_IF);但若它是字符串(如 ';'),reset() 将失败。而原逻辑真正想检查的,是第一个有意义的 token(非 T_OPEN_TAG)的类型 ID,这应直接取 $tokens[1][0](当它是数组时)。

立即学习PHP免费学习笔记(深入)”;

ARC Lab
ARC Lab

腾讯旗下ARC实验室推出的AI人像修复、抠图和增强工具

下载

✅ 推荐的安全展开写法如下:

$tokens = token_get_all('');

// 跳过 T_OPEN_TAG(通常为 $tokens[0]),定位第一个实际 token
$firstRealToken = null;
foreach ($tokens as $token) {
    if (is_array($token) && $token[0] === T_OPEN_TAG) {
        continue;
    }
    $firstRealToken = $token;
    break;
}

if ($firstRealToken === null) {
    return true; // 无有效 token,视为非关键字(边缘情况)
}

if (!is_array($firstRealToken)) {
    // 纯字符串 token(如 ';'、'{'),说明原字符串未被解析为关键字或标识符
    // 通常意味着输入非法或为空,保守返回 false(非保留字)
    return false;
}

// 此时 $firstRealToken 形如 [T_IF, 'if', 1],检查 token ID
return $firstRealToken[0] !== T_STRING;

? 注意事项

  • 不要依赖 $tokens[1] 的固定索引:token_get_all() 在遇到空格、注释等时可能插入额外 token,索引不可靠;
  • 始终先 is_array() 检查再访问 $token[0],避免类型错误与运行时警告;
  • 使用 T_OPEN_TAG 显式跳过起始标签,比硬编码索引更健壮;
  • PHPStan 友好:所有分支类型明确,无混合类型操作。

该写法不仅消除了 PHPStan 报错,还提升了可读性与鲁棒性,是生产环境中推荐的实现方式。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

564

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

790

2023.08.22

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6271

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

825

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1073

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1430

2024.03.01

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

184

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

291

2024.02.23

抖音网页版入口与视频观看指南 抖音官网视频在线访问
抖音网页版入口与视频观看指南 抖音官网视频在线访问

本专题汇总了抖音网页版的入口链接、官方登录页面以及视频观看入口,帮助用户快速访问抖音网页版,提供免登录访问方式和直接进入视频播放页面的方法,确保顺利浏览和观看抖音视频。

0

2026.02.04

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 11万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号