为了更好地理解Laravel标记设置的工作原理,我尝试了以下方法:
Blade::setContentTags('<x', 'x>');
Blade::setEscapedContentTags('<y', 'y>');
Blade::setRawTags('<z', 'z>');
在我的控制器构造函数中。
在Blade视图中,我添加了
<div>
<x 'test' x>
<y 'test' y>
<z 'test' z>
</div>
我清理了storage / framework / views文件夹并重新加载了页面。
结果,在编译视图中我得到了
<div>
<?php echo e('test'); ?>
<?php echo e('test'); ?>
<?php echo 'test'; ?>
</div>
如您所见,为使用setContentTags和setEscapedContentTags指定的标记编译的代码看起来相同。为什么我们需要这两个选项?
答案 0 :(得分:2)
这是一种安全理由。
默认情况下,Blade
将为包含常规和转义标记的内容返回相同的结果。 BladeCompiler
类已保护属性$echoFormat
,其值为e(%s)
。当内容使用常规标记(在您的情况下是&#39; x&#39;)进行编译时,将使用此属性。
/**
* The "regular" / legacy echo string format.
*
* @var string
*/
protected $echoFormat = 'e(%s)';
该属性用作函数e
/**
* Escape HTML entities in a string.
*
* @param string $value
* @return string
*/
function e($value)
{
return htmlentities($value, ENT_QUOTES, 'UTF-8', false);
}
当内容使用转义标记进行编译时,也会调用e
函数(在您的情况下,它是&#39; y&#39;)
您也可以更改格式:
/**
* Set the echo format to be used by the compiler.
*
* @param string $format
* @return void
*/
public function setEchoFormat($format)
{
$this->echoFormat = $format;
}
如果您的文字前面带有Blade
符号,则使用默认设置regular
会为包含escaped tags
和@
的内容返回不同的结果。
对于查看参数
['str' => "<script>alert('name')</script>"]
使用模板
<div>@{{ $str }}</div>
<div>@{{{ $str }}}</div>
<div>@{{"<a>Plain text</a>"}}</div>
<div>@{{{"<a>Plain text</a>"}}}</div>
结果将是
<div>{{ $str }}</div>
<div>@<script>alert('name')</script></div>
<div>{{"<a>Plain text</a>"}}</div>
<div>@<a>Plain text</a></div>