web-dev-qa-db-ja.com

Laravel BladeテンプレートのすべてのHTMLのエスケープ

Laravelに小さなCMSを構築しています。コンテンツ(DBに保存されている)を表示しようとしました。 HTMLタグを実行する代わりに表示しています。すべての印刷データに自動html_entity_decodeがあるようです。

<?php

class CmsController extends BaseController
{
    public function Content($name)
    {    
        $data = Pages::where('CID', '=', Config::get('company.CID'))
            ->where('page_name', '=', $name)
            ->first();

        return View::make('cms.page')->with('content', $data);
    }
}

中かっこを使用してコンテンツを印刷しようとしました。

{{ $content->page_desc }}

トリプル中括弧。

{{{ $content->page_desc }}}

そして、それらは同じ結果をもたらします。これらのHTMLタグをエスケープする代わりに実行する必要があります。

56
Dr.Neo

構文を{{ }}から{!! !!}に変更します。

アルファが上記のコメントで述べたように(答えではないので投稿したいと思います)、Laravel 5では、{{ }}(以前はエスケープされていなかった出力構文)が{!! !!}に変更されました。 {{ }}{!! !!}に置き換えれば、動作するはずです。

132
Ivan Topolcic

このタグを使用してください{!!説明テキスト!!}

13
sanjay

コンテンツを{! !}.

7
Avinash Kumar

同じ問題がありました。上記の回答をありがとう、問題を解決しました。同じ問題に直面している人がいる場合、これを解決する2つの方法があります。

  • {!! $news->body !!}を使用できます
  • 次のような従来のphpオープニングを使用できます(推奨されません):<?php echo $string ?>

役に立てば幸いです。

5

ブレードテンプレートにHTMLコードを表示しても問題はありません。

テストのために、routes.phpに追加できるルートは1つだけです。

Route::get('/', function () {

        $data = new stdClass();
        $data->page_desc
            = '<strong>aaa</strong><em>bbb</em>
               <p>New paragaph</p><script>alert("Hello");</script>';

        return View::make('hello')->with('content', $data);
    }
);

およびhello.blade.phpファイル内:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
</head>
<body>

{{ $content->page_desc }}

</body>
</html>

次のコードでは、画像のように出力が得られます

Output

したがって、おそらくpage_descはあなたが期待するものではありません。しかし、あなたが見るように、誰かが例えば '`タグを使用すると潜在的に危険になる可能性があるため、おそらくブレードテンプレートに割り当てる前にルートでいくつかのタグをフィルタリングする必要があります

編集

同じコードをデータベースに入れてテストしました:

Route::get('/', function () {

        $data = User::where('id','=',1)->first();

        return View::make('hello')->with('content', $data);
    }
);

この場合、出力はまったく同じです

Edit2

Pagesがあなたのモデルなのか、それがベンダーモデルなのかもわかりません。たとえば、内部にアクセサーを持つことができます:

public function getPageDescAttribute($value)
{
    return htmlspecialchars($value);
}

page_desc属性を取得すると、htmlspecialcharsで変更されたpage_descを取得します。したがって、データベース内のデータが生のhtml(エスケープされていない)であることが確実な場合は、このPagesクラスを調べる必要があります。

2