How/where Symfony 会自动注释 <?php 标签吗?

How/where does Symfony comment <?php tag automatically?

我试图通过 Symfony 5.0.8 的 code 标签在论坛上使用 <?php 标签。

不知何故 Symfony(或 Twig,我不能在这里说)神奇地将它放在评论之间,我真的不知道这样做的位置、方式和原因。

显然,我正在通过 raw 过滤器将我的数据传输到我的 twig 模板中。这是一些可视化的代码。

控制器

public function show(Post $post) {
    $this->render('show.html.twig', ['post' => $post]);
}

Twig 模板

{% for comment in post.comments %}
  {{ comment.content|raw }}
{% endfor %}

这是您可以在我的数据库中为 comment table

找到的文本示例
| id | post_id |                   content                  |
|  1 |    1    | <p>hey there <?php die('hijacked'); ?></p> |

以及显示的内容

<p>hey there <!--?php die('hijacked'); ?--></p>

如何允许使用 <?php 标签?安全吗?如果没有,我怎样才能保证安全?

如评论中所述,您想在帖子中显示 php 脚本的内容。您不想执行脚本。这已经是天壤之别了。

您正在使用 tgalopin/html-sanitizer 来清理用户输入。一般来说,你想在输出时进行消毒,not on input. So instead of using |raw in your template, call html-sanitizer's |sanitize_html filter (docs)。这将对输出产生微小但显着的差异:

使用|raw:

<p>hey there <?php die('hijacked'); ?></p>

您的浏览器会将其转换为 <!--?..,因为它无法将 <?php .. 识别为有效的 HTML 元素(并且会尝试修复 HTML 文档):

<p>hey there <!--?php die('hijacked'); ?--></p>

使用|sanitize_html:

<p>hey there &lt;?php die('hijacked'); ?&gt;</p>

因为 |sanitize_html 允许 p 标签并转义 php 标签,您的浏览器知道如何呈现页面:它将 p 标签解析为 HTML 元素,而 php 标签只是文本。这使得一切都按预期工作。