LaravelCollective / html избежать несоответствия с двойными фигурными скобками - PullRequest
0 голосов
/ 13 апреля 2020

Вкл. Laravel 5.8. Я могу использовать двойные фигурные скобки для экранирования строки {{ "<script>alert('does not work');</script>" }} или переменной {{ $comment }}

Однако, если я использую пакет LaravelCollective / html для создания элементов html двойные фигурные скобки ничего не спасают. {{ Form::input('edit', 'test') }} создает вход.

Как LaravelCollective / html достигает этого или это исключение в самом синтаксисе Blade? Является ли {{ }} безопасным способом избежать чего-либо, если оно иногда сбежало, а иногда нет? Могу ли я сделать собственный класс, чтобы обмануть Laravel, заставив его думать, что я использую LaravelCollective / html, и получить неэкранированный контент, напечатанный с помощью пользовательского класса / объекта с {{ }}?

1 Ответ

0 голосов
/ 14 апреля 2020

Кажется, что LaravelCollective / html достигает этого, регистрируя пользовательский обработчик с BladeCompiler::directive(), так что это функция расширения, предоставляемая Blade. Поэтому безопасно использовать {{ }} как для экранирования, так и для создания html элементов с помощью LaravelCollective.

Для справки приведен фрагмент из HtmlServiceProvider. php в LaravelCollective / Html о том, как это делается.

/**
 * 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); ?>";
                    });
                }
            }
        }
    });
}
...