回答:
使用する必要があります
{!! $text !!}
を使用すると、文字列は自動的にエスケープされ{{ $text }}
ます。
Hello, {!! $name !!}.
」laravel.com/docs/5.5/blade#displaying-data
$text
ユーザー入力が含まれていて、これを適切にエスケープしなかった場合、セキュリティ上の問題である可能性が非常に高くなります。たとえば、XSSを許可するHTMLを含める$text = 'Hello <b>'.$_GET['name'].'</b>';
こと$_GET['name']
ができるので危険です。あなたがすることができ$text = 'Hello <b>'.htmlentities($_GET['name']).'</b>';
、安全です。
<meta cc="grâce à">
、それをブレードで見せたいなら、それはこのようになります<meta cc="grâce à">
。だから私のための答えは@Praveen_Dabralの
使ってください
{!! $test !!}
HTMLの場合のみ、データや文字列などをレンダリングする場合に使用します。
{{ $test }}
これは、ブレードファイルがコンパイルされるときに
{{ $test }}
に変換されます <?php echo e($test) ?>
ながら、
{!! $test !!}
に変換されます <?php echo $test ?>
別の方法があります。オブジェクトの目的がhtmlをレンダリングすることである場合\Illuminate\Contracts\Support\Htmlable
は、toHtml()
メソッド。
次に{{ $someObject }}
、このオブジェクトをブレードから次のようにレンダリングできます(注、{!! !!}
構文)。
また、htmlプロパティを返す必要があり、それがhtmlになることがわかっている場合は、次の\Illuminate\Support\HtmlString
ようなクラスを使用します。
public function getProductDescription()
{
return new HtmlString($this->description);
}
そしてそれを次のように使用します {{ $product->getProductDescription() }}
ます。
もちろん、ページ上に未加工のHTMLを直接レンダリングするときに責任があります。
あなたはlaravel 5.で多くの方法で行うことができます。
{!! $text !!}
{!! html_entity_decode($text) !!}
以下のような条件の場合、最初に使用する3つの方法を使用してそれを行うことができます
{!! $text !!}
二番目の方法です
<td class="nowrap">
@if( $order->status == '0' )
<button class="btn btn-danger">Inactive</button>
@else
<button class="btn btn-success">Active</button>
@endif
</td>
ブレードで三項演算子を使用するための3番目の適切な方法
<td class="nowrap">
{!! $order->status=='0' ?
'<button class="btn btn-danger">Inactive</button> :
'<button class="btn btn-success">Active</button> !!}
</td>
3番目の方法がブレードで使用される三項演算子に最適であることを願っています。
さらに説明を加えると、Blade {{ }}
ステートメント内のコードはhtmlspecialchars()
、phpが提供する関数に自動的に渡されます。この関数は文字列を受け取り、HTMLが使用するすべての予約文字を検索します。予約文字は&
<
>
および"
です。次に、これらの予約文字をHTMLエンティティバリアントに置き換えます。次はどれですか。
|---------------------|------------------|
| Character | Entity |
|---------------------|------------------|
| & | & |
|---------------------|------------------|
| < | < |
|---------------------|------------------|
| > | > |
|---------------------|------------------|
| " | " |
|---------------------|------------------|
たとえば、次のphpステートメントがあるとします。
$hello = "<b>Hello</b>";
{{ $hello }}
あなたが渡したリテラル文字列を生成するようにブレードに渡されます:
<b>Hello</b>
内部的には、実際には <b>Hello<b>
これをバイパスして実際にボールドタグとしてレンダリングする場合はhtmlspecialchars()
、エスケープ構文ブレードを追加して関数をエスケープし ます。
{!! $hello !!}
中括弧は1つだけ使用していることに注意してください。
上記の出力は次のようになります。
こんにちは
phpが提供する別の便利な関数、つまり関数を利用することもできhtml_entity_decode()
ます。これにより、HTMLエンティティが尊重されるHTML文字に変換されます。それの逆と考えてくださいhtmlspecialchars()
たとえば、次のphpステートメントがあるとします。
$hello = "<b> Hello <b>";
これで、この関数をエスケープされたブレードステートメントに追加できます。
{!! html_entity_decode($hello) !!}
これにより、HTMLエンティティが取得さ<
れ<
、文字列だけでなくHTMLコードとして解析されます。
同じはより大きいエンティティにも適用されます >
降伏する
こんにちは
そもそも脱出のポイントは、XSS攻撃を回避することです。したがって、エスケープ構文を使用するときは特に注意してください。特に、アプリケーションのユーザーが自分でHTMLを提供している場合は、好きなように独自のコードを挿入できます。
データ使用を回避したい場合
{{ $html }}
データ使用をエスケープしたくない場合
{!! $html !!}
しかし、Laravel-4までは使用できます
{{ HTML::link('/auth/logout', 'Sign Out', array('class' => 'btn btn-default btn-flat')) }}
Laravel-5になると
{!! HTML::link('/auth/logout', 'Sign Out', array('class' => 'btn btn-default btn-flat')) !!}
PHP関数を使用してこれを行うこともできます
{{ html_entity_decode($data) }}
この関数のパラメータについては、PHPドキュメントを確認してください
これはLaravel 5.6で正常に動作します
<?php echo "$text"; ?>
別の方法で
{!! $text !!}
HTMLコードをレンダリングせず、文字列として印刷しません。
詳細については、リンクを開いてください:- ブレードでHTMLを表示
{!! nl2br($post->description) !!}
スペースとbrしかない場合は、