此刀片卫生是否正常工作(双花括号与三重花括号)


Is this Blade sanitation working correctly (double vs triple curly braces)?

很抱歉,这很可能是我自己的误解,而不是实际问题。我对 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 的攻击 利用。此外,带有{{--的评论将不再有效。