很抱歉,这很可能是我自己的误解,而不是实际问题。我对 Laravel 和 Blade 模板相当陌生,我正在尝试输出从Input::get
中获取的一些字段。但是,当我通过双大括号和三大括号输出字段时,输出之间似乎没有区别。
以下是我的观点摘录:
@ $data = Input::only('name', 'date');
{{ "Unfiltered input: ".$data['name'] }}
<br />
{{{ "Filtered input: ".$data['name'] }}}
但是,当我提供包含特殊字符或代码的输入并查看呈现页面的源时,我看到为两者呈现的相同、未经筛选的输入。
根据Laravel文档,我想在输出到视图时严格使用该{{{ }}}
,但我没有看到它实际上被"转义或净化"。我还没有完全建立验证,这是我认为安全和卫生的主要首当其冲的地方,对吗?但是现在只关注这一点,我是否误解了三重花括号应该做什么?还是他们在幕后做工作,而我只是没有在最终结果中看到它?在输出这样的用户输入时,我还应该做其他事情(除了设置验证层(吗?
Laravel 4
双花括号和三重大括号之间的唯一区别是三重大括号通过 e()
帮助程序函数运行值,该函数只是 PHP htmlentities 函数的快捷方式。
{{ "Unfiltered input: ".$data['name'] }}
{{{ "Filtered input: ".$data['name'] }}}
编译成:
<?php echo "Unfiltered input: ".$data['name']; ?>
<?php echo e("Filtered input: ".$data['name']); ?>
但是,所有这些都发生在输出上。 它与清理输入没有任何关系。
拉拉维尔 5
在Laravel 5中,Blade语法被更改,以便双大括号({{ }}
(将转义输出,并且新的大括号双感叹号语法({!! !!}
(不会转义输出。
所以
{{ "Filtered input: ".$data['name'] }}
{!! "Unfiltered input: ".$data['name'] !!}
编译成:
<?php echo e("Filtered input: ".$data['name']); ?>
<?php echo "Unfiltered input: ".$data['name']; ?>
除了公认的答案之外,值得一提的是,从 Laravel 5 开始,{{ }}
的工作方式与 {{{ }}}
相同
https://laravel.com/docs/5.2/upgrade#upgrade-5.0
直接报价:
为了在默认情况下提高安全性,Laravel 5.0 转义了所有输出
{{ }}
和{{{ }}}
刀片指令。新{!! !!}
引入了指令来显示原始的、未转义的输出。最安全 升级应用程序时的选项是仅使用新{!! !!}
指令,当您确定显示原始输出是安全的时。但是,如果必须使用旧的 Blade 语法,请添加以下行 在
AppServiceProvider@register
的底部:
'Blade::setRawTags('{{', '}}'); 'Blade::setContentTags('{{{', '}}}');
'Blade::setEscapedContentTags('{{{', '}}}');
不应该这样做 轻而易举,可能会使您的应用程序更容易受到 XSS 的攻击 利用。此外,带有
{{--
的评论将不再有效。