为啥控制器发送的 html 代码显示在我的页面中? [复制]
Posted
技术标签:
【中文标题】为啥控制器发送的 html 代码显示在我的页面中? [复制]【英文标题】:why the html code sent by controller displays in my page? [duplicate]为什么控制器发送的 html 代码显示在我的页面中? [复制] 【发布时间】:2021-12-17 00:53:30 【问题描述】:我在ecommerce
站点工作,我想测试product
(annonce)的quantity
,如果qty = 0
显示Not Avialable
处于危险颜色,如果qty <= 5
显示low Stock
在如果qty > 5
以成功颜色显示in Stock
,则为颜色。
在我的示例中,它显示在我的 html 代码页中。
AnnoncesController.php
public function show($id)
$annonces = Annonce::where('id',$id)->firstOrfail();
$mightAlsoLike = Annonce::where('id', '!=', $id)->mightAlsoLike()->get();
if( $annonces->quantity > setting('site.stock_threshold') )
$stockLevel = '<div class="badge badge-pill badge-success">in stock</div>';
elseif($annonces->quantity <= setting('site.stock_threshold') && $annonces->quantity > 0)
$stockLevel = '<div class="badge badge-pill badge-warning">low stock</div>';
else
$stockLevel = '<div class="badge badge-pill badge-danger">Not Avialable</div>';
return view('annonces.details')->with([
'annonces' => $annonces,
'stockLevel' => $stockLevel,
'mightAlsoLike' => $mightAlsoLike
]);
details.blade.php
<div> $stockLevel </div>
【问题讨论】:
肯定是因为 $stockLevel 的值会自动转换为 HTML 实体。 【参考方案1】:!! $stockLevel !!
试试这个。它是我的工作
【讨论】:
如果你回答一个问题,不要只说“试试这个”,而是解释你的答案。 发送 html !! !! 如果您使用 $stockLevel 它读取文本,请使用它。 不,因为
转义 html ,而 !! !!
是原始回显。不建议在用户输入中使用!! !!
,因为您容易受到 XSS 攻击。【参考方案2】:
如果你想显示编译后的 html,你可以使用下面的语法和文档可以找到 Here
<div>!! $stockLevel !!</div>
或者你可以使用HtmlString
类
<div>new Illuminate\Support\HtmlString($stockLevel )</div>
小心 XSS 漏洞
或者你可以从控制器传递数据
public function show($id)
$stockLevelStatus = $stockLevelBadge = null;
$annonces = Annonce::where('id', $id)->firstOrfail();
$mightAlsoLike = Annonce::where('id', '!=', $id)->mightAlsoLike()->get();
if ($annonces->quantity > setting('site.stock_threshold'))
$stockLevelStatus = 'In Stock';
$stockLevelBadge = 'badge-success';
elseif ($annonces->quantity <= setting('site.stock_threshold') && $annonces->quantity > 0)
$stockLevelStatus = 'Low Stock';
$stockLevelBadge = 'badge-warning';
else
$stockLevelStatus = 'Not Avialable';
$stockLevelBadge = 'badge-danger';
return view('annonces.details')->with([
'annonces' => $annonces,
'stockLevelStatus' => $stockLevelStatus,
'stockLevelBadge' => $stockLevelBadge,
'mightAlsoLike' => $mightAlsoLike,
]);
秃头:
<div>
<div class="badge badge-pill $stockLevelBadge">
$stockLevelStatus
</div>
</div>
【讨论】:
【参考方案3】:如果您不希望您的数据被转义,您可以使用以下语法:
!! $stockLevel !!
但我不推荐它。默认情况下,Blade
语句会通过 php 的 htmlspecialchars
函数自动发送,以防止 XSS 攻击。最好通过 Blade 设置条件:
@if($annonces->quantity > setting('site.stock_threshold'))
<div class="badge badge-pill badge-success">in stock</div>
@elseif($annonces->quantity <= setting('site.stock_threshold') && $annonces->quantity > 0)
<div class="badge badge-pill badge-warning">low stock</div>
@else
<div class="badge badge-pill badge-danger">Not Avialable</div>
@endif
【讨论】:
以上是关于为啥控制器发送的 html 代码显示在我的页面中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章