我很抱歉这很可能是对我自己的误解,而不是存在实际问题。我对Laravel和Blade模板很新,我试图输出一些Input::get
的字段。但是,当我通过双花括号和三花括号输出字段时,输出似乎没有区别。
以下是我的观点的摘录:
@ $data = Input::only('name', 'date');
{{ "Unfiltered input: ".$data['name'] }}
<br />
{{{ "Filtered input: ".$data['name'] }}}
但是当我提供带有特殊字符或代码的输入并且我查看渲染页面的来源时,我看到为两者渲染的相同的未经过滤的输入。
根据Laravel documentation,我希望在输出到视图时严格使用{{{ }}}
,但我不会看到它实际上正在被转义或纯化&#34; 。我还没有建立Validation,我相信安全和卫生的主要原因是,对吗?但是现在只关注这个问题,我是否误解了三重花括号应该做什么?或者他们是否在幕后工作,而我在最终结果中却没有看到它?在输出像这样的用户输入时,我还应该做些什么(除了设置验证层)?
答案 0 :(得分:9)
双花括号和三花括号之间的唯一区别是三花括号通过e()
辅助函数运行值,这只是PHP htmlentities函数的快捷方式。
{{ "Unfiltered input: ".$data['name'] }}
{{{ "Filtered input: ".$data['name'] }}}
编译成:
<?php echo "Unfiltered input: ".$data['name']; ?>
<?php echo e("Filtered input: ".$data['name']); ?>
但是,所有这些都发生在输出上。它与消毒输入没有任何关系。
在Laravel 5中,Blade语法已更改,因此双花括号({{ }}
)将转义输出,并且新的花括号双重感叹语法({!! !!}
)不会转义输出。
所以,
{{ "Filtered input: ".$data['name'] }}
{!! "Unfiltered input: ".$data['name'] !!}
编译成:
<?php echo e("Filtered input: ".$data['name']); ?>
<?php echo "Unfiltered input: ".$data['name']; ?>
答案 1 :(得分:3)
除了接受的答案之外,值得一提的是,Laravel 5 {{ }}
与{{{ }}}
https://laravel.com/docs/5.2/upgrade#upgrade-5.0
直接报价:
为了更好的安全性,Laravel 5.0将转义所有输出
{{ }}
和{{{ }}}
Blade指令。一个新的{!! !!}
已引入指令以显示原始的非转义输出。最安全的 升级应用程序时的选项是仅使用新的{!! !!}
当你确定显示原始输出是安全的时,指令。但是,如果必须使用旧的Blade语法,请添加以下行 在
AppServiceProvider@register
的底部:
\Blade::setRawTags('{{', '}}'); \Blade::setContentTags('{{{', '}}}');
\Blade::setEscapedContentTags('{{{', '}}}');
不应该这样做 轻微地,可能会使您的应用程序更容易受到XSS的攻击 战功。此外,
{{--
的评论将不再有效。