LaravelCollective/html 使用双花括号转义不一致
LaravelCollective/html escape inconsistency with double curly braces
On Laravel 5.8 我可以使用双花括号转义字符串 {{ "<script>alert('does not work');</script>" }}
或变量 {{ $comment }}
但是,如果我使用 LaravelCollective/html 包来创建 html 元素,双花括号不会转义任何内容。 {{ Form::input('edit', 'test') }}
创建输入。
LaravelCollective/html 是如何做到这一点的,或者这是 Blade 语法本身的一个例外? {{ }}
是一种安全的方式来逃避任何东西,如果它有时被逃脱,有时又不是?我可以自定义 class 来愚弄 Laravel 以为我正在使用 LaravelCollective/html 并使用自定义 class/object 和 {{ }}
打印未转义的内容吗?
似乎 LaravelCollective/html 通过向 BladeCompiler::directive()
注册自定义处理程序来实现此目的,因此这是 Blade 提供的扩展功能。因此,使用 {{ }}
转义和使用 LaravelCollective 创建 html 元素是安全的。
作为参考,这里是 LaravelCollective/Html 中 HtmlServiceProvider.php 的片段,说明了它是如何完成的。
/**
* Register Blade directives.
*
* @return void
*/
protected function registerBladeDirectives()
{
$this->app->afterResolving('blade.compiler', function (BladeCompiler $bladeCompiler) {
$namespaces = [
'Html' => get_class_methods(HtmlBuilder::class),
'Form' => get_class_methods(FormBuilder::class),
];
foreach ($namespaces as $namespace => $methods) {
foreach ($methods as $method) {
if (in_array($method, $this->directives)) {
$snakeMethod = Str::snake($method);
$directive = strtolower($namespace).'_'.$snakeMethod;
$bladeCompiler->directive($directive, function ($expression) use ($namespace, $method) {
return "<?php echo $namespace::$method($expression); ?>";
});
}
}
}
});
}
On Laravel 5.8 我可以使用双花括号转义字符串 {{ "<script>alert('does not work');</script>" }}
或变量 {{ $comment }}
但是,如果我使用 LaravelCollective/html 包来创建 html 元素,双花括号不会转义任何内容。 {{ Form::input('edit', 'test') }}
创建输入。
LaravelCollective/html 是如何做到这一点的,或者这是 Blade 语法本身的一个例外? {{ }}
是一种安全的方式来逃避任何东西,如果它有时被逃脱,有时又不是?我可以自定义 class 来愚弄 Laravel 以为我正在使用 LaravelCollective/html 并使用自定义 class/object 和 {{ }}
打印未转义的内容吗?
似乎 LaravelCollective/html 通过向 BladeCompiler::directive()
注册自定义处理程序来实现此目的,因此这是 Blade 提供的扩展功能。因此,使用 {{ }}
转义和使用 LaravelCollective 创建 html 元素是安全的。
作为参考,这里是 LaravelCollective/Html 中 HtmlServiceProvider.php 的片段,说明了它是如何完成的。
/**
* Register Blade directives.
*
* @return void
*/
protected function registerBladeDirectives()
{
$this->app->afterResolving('blade.compiler', function (BladeCompiler $bladeCompiler) {
$namespaces = [
'Html' => get_class_methods(HtmlBuilder::class),
'Form' => get_class_methods(FormBuilder::class),
];
foreach ($namespaces as $namespace => $methods) {
foreach ($methods as $method) {
if (in_array($method, $this->directives)) {
$snakeMethod = Str::snake($method);
$directive = strtolower($namespace).'_'.$snakeMethod;
$bladeCompiler->directive($directive, function ($expression) use ($namespace, $method) {
return "<?php echo $namespace::$method($expression); ?>";
});
}
}
}
});
}