如何在 Twig 模板解析中保留并识别 raw 过滤器

千晨姑娘_5041

千晨姑娘_5041

2026-11-08

126人浏览

原创

如何在 Twig 模板解析中保留并识别 raw 过滤器

默认情况下,Twig 的优化器会移除 |raw 过滤器(因其被视为无副作用的“空操作”),导致通过 AST 解析时无法捕获该节点;需显式禁用相关优化选项以确保 FilterExpression 节点完整保留。

默认情况下,twig 的优化器会移除 `|raw` 过滤器(因其被视为无副作用的“空操作”),导致通过 ast 解析时无法捕获该节点;需显式禁用相关优化选项以确保 `filterexpression` 节点完整保留。

在使用 Twig 的 parse() + tokenize() 流程分析模板 AST 时,若目标是检测或处理特定过滤器(如 |raw),开发者常遇到一个隐性陷阱:|raw 节点在默认配置下根本不会出现在最终语法树中。

这是因为 Twig 内置的 OptimizerNodeVisitor 在启用优化时(默认开启部分优化),会主动移除 raw 过滤器——其逻辑认为:raw 仅用于取消自动转义,不改变表达式值本身,在编译阶段可安全剥离,交由渲染时的上下文决定是否转义。因此,即使模板中明确写了 {{ attributes|raw|lower }},解析出的 \Twig\Node\Expression\FilterExpression 节点链里也只会剩下 |lower,raw 已被提前消除。

✅ 正确解决方案是:禁用影响 raw 保留的优化项。推荐做法是在初始化 Twig\Environment 时,将 optimizations 配置设为 0(完全关闭优化),或至少排除 OPTIMIZE_RAW_FILTER(Twig ≥ 3.10+ 支持细粒度控制):

use Twig\Environment;
use Twig\Loader\FilesystemLoader;
use Twig\NodeVisitor\OptimizerNodeVisitor;

$loader = new FilesystemLoader('/path/to/templates');
$options = [
    'cache' => sys_get_temp_dir(),
    'optimizations' => 0, // 关键:彻底禁用所有 AST 优化
    // 或更精准地(Twig v3.10+):
    // 'optimizations' => OptimizerNodeVisitor::OPTIMIZE_ALL & ~OptimizerNodeVisitor::OPTIMIZE_RAW_FILTER,
];

$twig = new Environment($loader, $options);

// 后续解析流程保持不变
$source = new \Twig\Source(file_get_contents($templatePath), 'example.twig');
$tree = $twig->parse($twig->tokenize($source));

// 现在 listFunctionCalls 可正确命中 raw 过滤器
function listFunctionCalls($node, array &$list) {
    if ($node instanceof \Twig\Node\Expression\FilterExpression) {
        $filterNode = $node->getNode('filter');
        $filterName = $filterNode->getAttribute('value') ?? '';
        if ($filterName === 'raw') {
            $list[] = [
                'line' => $node->getLine(),
                'parent' => get_class($node->getNode('node')),
            ];
        }
    }
    foreach ($node as $child) {
        listFunctionCalls($child, $list);
    }
}

$functions = [];
listFunctionCalls($tree, $functions);
var_dump($functions); // 输出包含 'raw' 的匹配项

⚠️ 注意事项:

  • 关闭优化仅影响 AST 解析与分析阶段,不影响运行时性能或安全性;|raw 在渲染时仍按预期生效(即跳过自动转义)。
  • 若项目依赖其他优化(如变量访问优化),可采用位运算精确剔除 OPTIMIZE_RAW_FILTER,避免过度降级(需确认 Twig 版本支持)。
  • 始终对 |raw 的使用保持警惕:它绕过 Twig 默认的 XSS 防护,应确保传入内容绝对可信。

通过此配置调整,即可稳定、可靠地在静态分析流程中识别 raw 过滤器,满足模板审计、安全扫描或自定义编译规则等进阶需求。

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

12444

6

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

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

2023.10.11

7181

5

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

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

2023.10.11

2215

5

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

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

2023.10.23

4508

4

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

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

2023.10.23

5234

6

html怎么上传
html怎么上传

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

2023.11.03

4111

9

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

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

2023.11.09

5957

8

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

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

2023.11.13

4682

8

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

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

2023.11.27

12482

4

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习