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 <?php die('hijacked'); ?></p>
因为 |sanitize_html
允许 p
标签并转义 php
标签,您的浏览器知道如何呈现页面:它将 p
标签解析为 HTML 元素,而 php
标签只是文本。这使得一切都按预期工作。
我试图通过 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 <?php die('hijacked'); ?></p>
因为 |sanitize_html
允许 p
标签并转义 php
标签,您的浏览器知道如何呈现页面:它将 p
标签解析为 HTML 元素,而 php
标签只是文本。这使得一切都按预期工作。