为啥控制器发送的 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 语句会通过 phphtmlspecialchars 函数自动发送,以防止 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 代码显示在我的页面中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的页面上没有出现 JQuery UI 滑块?

为啥我的 AJAX 方法将表单输入发送到 URL?

为啥发件人行在我的邮件功能上不起作用?

为啥总是在我的代码中显示语法错误?

为啥浏览器控制台日志给我错误“数据表不是函数”?

为啥我的频道消息发送代码不起作用?