【问题标题】:Laravel Blade Form::select -- now forcing escape?Laravel Blade Form::select -- 现在强制逃跑?
【发布时间】:2017-02-02 16:25:23
【问题描述】:

我从 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: escape code here

我已经暂时(并且成功地)使用了这个补丁:

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

上面的代码在 $v var 中有货币的转义码,并在选择框中正确显示。

请帮忙 - 这会破坏我应用上的很多表单。

谢谢。

编辑:我仍然可以使用 {!! !!} 其他地方。它似乎只影响 Form::select() 项目。因此我开始认为这不是 Laravel 的刀片逃生问题,而是最新版本的 Laravel 集体表单功能问题

解决方案:我向 Laravel Collective 开发团队记录了这一点,但这显然没有被回滚。请参阅https://github.com/LaravelCollective/html/issues/296 了解最新信息。

【问题讨论】:

  • 是的,这确实是 Laravelcollective Formbuilder 的问题。我将此问题跟踪到文件 /vendor/laravelcollective/html/src/FormBuilder.php 第 683 行,其中有“$this->html->escapeAll($display)”导致问题。也许您可以尝试联系开发人员,他们确实会收听电子邮件。请随时更新。
  • 哇。一个实际的错误。非常感谢@Miloslav Milo Janoušek,我不必再认为我疯了。我会联系开发团队。

标签: laravel blade html-escape-characters laravelcollective


【解决方案1】:

您可以通过将 Laravelcollective html 包降级到版本 5.3.0(从当前版本的 5.3.1 降级)来“修复”它。只需编辑 composer.json "require"

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

用这个:

"laravelcollective/html": "5.3.0",

缺点是您将使用旧版本,它可能有一些其他问题已在 5.3.1 中修复,但我没有任何具体信息。

【讨论】:

  • 非常感谢。真的很感谢你帮我打猎,我无法透过树木看到森林。太棒了!
【解决方案2】:

是的,这是 Laravel 5.0 的新语法。只需切换到{! !!} 足以修复使用表单元素。

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

刀片标签更改

默认情况下为了更好的安全性,Laravel 5.0 会转义来自 {{ }} 和 {{{ }}} Blade 指令的所有输出。一个新的{!! !!} 指令已被引入以显示原始的、未转义的输出。升级应用程序时最安全的选择是只使用新的 {!! !!} 指令,当您确定显示原始输出是安全的时。

但是,如果您必须使用旧的 Blade 语法,请在 AppServiceProvider@register 的底部添加以下行:

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

这不应该轻易完成,并且可能会使您的应用程序更容易受到 XSS 攻击。此外,带有 {{-- 的 cmets 将不再工作。

【讨论】:

  • 感谢亚当的回复。是的, {!! !!} 应该可以正常工作,但这就是问题所在 - 它没有。
  • 您有明确的错误信息吗?在 Laravel 5.0 中移除了 forms 包。你可能需要安装 Laravel Collectives 包,他们接管了工作。 laravelcollective.com/docs/5.0/html"laravelcollective/html": "~5.0"
  • 嗨@Adam。不,没有错误。其他一切正常。所有其他 Form:: 功能都在工作,包括这个。它只是在不应该的时候强迫逃跑。该软件包是正确的,并且自他们接管以来已作为 laravelcollective 加载 - 它一直运行良好。 IE 代码没有变化——更新到最新版本的 Laravel/Collective 后就坏了。我想知道是否有其他人可以在 Form::select 中用符号重现该问题。
【解决方案3】:

在此问题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>');

在最新版本发布之前,它对我有用。

【讨论】:

    【解决方案4】:

    改为使用

    {!! your code !!}
    

    尝试使用

    {{ your code }}
    

    {!! !!} 用于显示未转义的数据。来自doc

    显示未转义的数据

    默认情况下,Blade {{ }} 语句会自动通过 PHP 的 htmlentities 函数可以防止 XSS 攻击。如果你不想 您的数据要转义,您可以使用以下语法:

    你好,{!! $name !!}。

    在回显您的用户提供的内容时要非常小心 应用。始终使用转义的双花括号语法 在显示用户提供的数据时防止 XSS 攻击。

    【讨论】:

    • 感谢@Gayan 的回复。使用 {{ }} 不会显示 $,它会显示 HTML 符号。问题是 {{ }} 和 {!! !!} 在选择框中显示 HTML 符号。在 5.3.30 之前从未出现过这种情况。例如。 {!!   !!}} 应该显示一个空格——现在没有。
    猜你喜欢
    • 1970-01-01
    • 2017-07-21
    • 2022-06-13
    • 1970-01-01
    • 2019-02-28
    • 2014-06-19
    • 1970-01-01
    • 2014-12-26
    • 2016-07-20
    相关资源
    最近更新 更多