Laravel Blade Form :: select теперь вызывает побег?

У меня этот код работает с L5.0. С последним обновлением до L5.3.30 + зависимости он кажется сломанным. Может быть, я сделал что-то не так с самого начала?

Вот упрощенный код:

    {!! Form::select('currency', ['USD'=>'USD: *escape code here*'], 
        null, ['class'=>'form-control', "required", 'id'=>'currency']) !!}

В течение последних нескольких лет этот код возвращал поле выбора с таким текстом: «USD: $».

После обновления Composer до L5.3.30 на всех серверах (test, dev, prod) теперь вместо этого возвращается символ html: «USD: здесь управляющий код».

Я временно (и успешно) исправил это, используя:

 <select name = 'currency' id="currency" required class="form-control">
       @foreach (\Helper::currency() as $k=>$v)
                  <option  value="{{$k}}">{!! $v !!}</option>
       @endforeach
 </select>

Приведенный выше код имеет escape-код для валюты в переменной $v и правильно отображается в поле выбора.

Пожалуйста, помогите - это ломает довольно много форм в моем приложении.

Спасибо.

РЕДАКТИРОВАТЬ: я все еще могу правильно отображать неэкранированный текст, используя {!! !!} где-либо еще. Кажется, это влияет только на элементы Form::select(). Поэтому я начинаю думать, что проблема не в побеге лезвия Laravel, а в последней версии функции Laravel Collective Form.

РЕШЕНИЕ: я сообщил об этом команде Laravel Collective Dev, но, по-видимому, это НЕ было отменено. См. https://github.com/LaravelCollective/html/issues/296 для последних .


person Watercayman    schedule 02.02.2017    source источник
comment
Да, это действительно проблема Laravelcollective Formbuilder. Я отследил эту проблему до файла /vendor/laravelcollective/html/src/FormBuilder.php, строка 683, там есть $this-›html-›escapeAll($display), который вызывает проблемы. Может быть, вы можете попробовать связаться с разработчиками, они прослушивают электронные письма. Пожалуйста, держите нас в курсе.   -  person Miloslav Milo Janoušek    schedule 03.02.2017
comment
Ух ты. Настоящий баг. Большое спасибо @Miloslav Milo Janousek, мне больше не нужно думать, что я сумасшедший. Я свяжусь с командой разработчиков.   -  person Watercayman    schedule 03.02.2017


Ответы (4)


Вы можете «исправить» это, понизив html-пакет Laravelcollective до версии 5.3.0 (по сравнению с 5.3.1, которая является текущей версией). Просто отредактируйте composer.json "require"

"laravelcollective/html": "5.3.*",

с этим:

"laravelcollective/html": "5.3.0",

Недостатком является то, что вы будете использовать более старую версию, в которой могут быть некоторые другие проблемы, которые уже были исправлены в 5.3.1, но у меня нет конкретной информации об этом.

person Miloslav Milo Janoušek    schedule 03.02.2017
comment
Большое тебе спасибо. Очень ценю, что вы охотитесь за этим для меня, я не мог видеть лес из-за деревьев. Превосходно! - person Watercayman; 03.02.2017

Да, это новый синтаксис Laravel 5.0. Просто переключиться на {!! !!} достаточно исправить с помощью элементов формы.

https://laravel.com/docs/5.0/upgrade

Изменения тегов блейда

Для большей безопасности по умолчанию Laravel 5.0 избегает всего вывода директив {{ }} и {{{ }}} Blade. Новый {!! !!} была введена директива для отображения необработанного, неэкранированного вывода. Самый безопасный вариант при обновлении вашего приложения — использовать только новый {!! !!}, если вы уверены, что отображать необработанный вывод безопасно.

Однако, если вы должны использовать старый синтаксис Blade, добавьте следующие строки внизу AppServiceProvider@register:

\Blade::setRawTags('{{', '}}');
\Blade::setContentTags('{{{', '}}}');
\Blade::setEscapedContentTags('{{{', '}}}');

Это не следует делать легкомысленно, и это может сделать ваше приложение более уязвимым › для эксплойтов XSS. Кроме того, комментарии с {{-- больше не будут работать.

person Adam    schedule 02.02.2017
comment
Спасибо за ответ Адам. Да, {!! !!} должно работать корректно, но вот в чем проблема - не работает. - person Watercayman; 02.02.2017
comment
У вас есть четкое сообщение об ошибке? Пакет форм был удален из Laravel в версии 5.0. Возможно, вам потребуется установить пакет Laravel Collectives, они взяли на себя работу. laravelcollective.com/docs/5.0/html "laravelcollective/html": "~5.0" - person Adam; 03.02.2017
comment
Привет @Адам. Нет, ошибки нет. Все остальное работает нормально. Все остальные функции Form:: работают, в том числе и эта. Это просто принуждение к побегу, когда этого не должно быть. Пакет правильный, и он был загружен как laravelcollective с тех пор, как они вступили во владение - он работает нормально. IE без изменений в коде - просто сломался после обновления до последней версии Laravel / Collective. Мне интересно, может ли кто-нибудь еще воспроизвести проблему в Form:: select с помощью символа. - person Watercayman; 03.02.2017

после этой проблемы https://github.com/LaravelCollective/html/issues/296 и этот коммит https://github.com/LaravelCollective/html/pull/297/files?diff=split ,

я изменил строку 683 ("$this->html->escapeAll()" на "e()" )

до

return $this->toHtmlString('<optgroup label="' . $this->html->escapeAll($label) . '">' . implode('', $html) . '</optgroup>');

после

return $this->toHtmlString('<optgroup label="' . e($label) . '">' . implode('', $html) . '</optgroup>');

это сработало для меня, прежде чем будет выпущена последняя версия.

person Rikad Fauzi Alawi    schedule 19.04.2017

Вместо этого используя

{!! your code !!}

попробуйте использовать

{{ your code }}

{!! !!} используется для отображения неэкранированных данных. Из документа

Отображение неэкранированных данных

По умолчанию операторы Blade {{ }} автоматически отправляются через функцию PHP htmlentities для предотвращения XSS-атак. Если вы не хотите, чтобы ваши данные были экранированы, вы можете использовать следующий синтаксис:

Привет, {!! $имя !!}.

Будьте очень осторожны при отображении контента, предоставленного пользователями вашего приложения. Всегда используйте экранированный синтаксис с двойными фигурными скобками для предотвращения XSS-атак при отображении данных, предоставленных пользователем.

person Gayan    schedule 02.02.2017
comment
Спасибо за ответ @Gayan. Использование {{ }} не будет отображать $, оно будет отображать символ HTML. Проблема в том, что ОБА {{ }} И {!! !!} отображают символ HTML в поле выбора. Такого никогда не было до 5.3.30. Например. {!! !!}} должен отображать пробел - сейчас его нет. - person Watercayman; 02.02.2017