2017-02-02 12 views
1

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

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

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

За последние несколько лет этот код вернувшихся выберите поле с текстом, как это: «USD: $»

После обновления композитора к L5.3.30 на всех серверах (тест, 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> 

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

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

спасибо.

EDIT: Я все еще могу правильно отобразить неэкранированный текст, используя {!! !!} где-либо еще. Похоже, что это касается только элементов Form :: select(). Поэтому я начинаю думать, что это не проблема с побегом лезвия Ларавеля, а скорее с последней версией функции коллективной формы Laravel.

РЕШЕНИЕ: Я отметил это коллективной коллективу команды Laravel, но это, по-видимому, НЕ было откат. См. https://github.com/LaravelCollective/html/issues/296 для получения последней информации.

+1

Да, это действительно проблема с Laravelcollective Formbuilder. Я проследил эту проблему до файла /vendor/laravelcollective/html/src/FormBuilder.php строки 683, есть «$ this-> html-> escapeAll ($ display)», что вызывает проблемы. Возможно, вы можете попытаться связаться с разработчиками, они слушают электронные письма. Пожалуйста, держите нас в курсе. –

+0

Ничего себе. Фактическая ошибка. Большое спасибо @ Милослав Мило Янушек, мне больше не нужно думать, что я сумасшедший. Я дойду до команды разработчиков. – Watercayman

ответ

1

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

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

с этим:

"laravelcollective/html": "5.3.0", 

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

+0

спасибо. Очень ценю, что вы охотитесь за мной, я не мог видеть лес через деревья. Отлично! – Watercayman

-1

Вместо использования

{!! your code !!} 

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

{{ your code }} 

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

Отображение Unescaped данных

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

Здравствуйте, {!! $ name !!}.

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

+1

Благодарим вас за ответ @Gayan. Использование {{}} не отображает $, на нем будет отображаться символ HTML. Проблема в том, что BOTH {{}} AND {!! !} отображают символ HTML в поле выбора. Это никогда не было до 5.3.30. Например. {!!   !!}} должно отображать пробел - это не сейчас. – Watercayman

0

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

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

клинка Тэг Изменения

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

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

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

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

+1

Спасибо за ответ Адам. Да, {!! !!} должен работать правильно, но в этом проблема - это не так. – Watercayman

+0

У вас есть сообщение об ошибке? Пакет форм был удален из Laravel в 5.0. Возможно, вам придется установить пакет Laravel Collectives, они взяли на себя эту работу. https://laravelcollective.com/docs/5.0/html '' laravelcollective/html ":" ~ 5.0 "' – Adam

+0

Привет @Adam. Нет, ошибки нет. Все остальное отлично работает.Все остальные функции Form :: работают, включая этот. Это просто заставляет бежать, когда этого не должно быть. Пакет прав, и он был загружен как laravelcollective, так как они взяли верх - он работал нормально. IE не изменяется на код - просто сломан после обновления до последней версии Laravel/Collective. Мне интересно, может ли кто-нибудь еще воспроизвести проблему в форме :: select с символом. – Watercayman

0

следуя этому вопросу https://github.com/LaravelCollective/html/issues/296 и это совершить https://github.com/LaravelCollective/html/pull/297/files?diff=split,

я изменил линию 683, ("$ this-> html-> escapeAll()" на "е()")

перед тем

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

после

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

он работал для меня, до последнего против чтобы освободить.