web-dev-qa-db-fra.com

Laravel Échapper à tout HTML dans le modèle de lame

Je construis un petit CMS dans Laravel et j'ai essayé de montrer le contenu (qui est stocké dans la base de données). Il montre les balises HTML au lieu de les exécuter. C'est comme s'il y avait un auto html_entity_decode pour toutes les données imprimées.

<?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);
    }
}

J'ai essayé d'imprimer le contenu à l'aide de l'accolade.

{{ $content->page_desc }}

et triple accolade.

{{{ $content->page_desc }}}

Et ils donnent le même résultat. Je dois exécuter ces balises HTML au lieu de les échapper.

56
Dr.Neo

Changez votre syntaxe de {{ }} à {!! !!}.

Comme The Alpha l’a dit dans un commentaire ci-dessus (pas une réponse, j’ai pensé que je posterais), dans Laravel 5, le {{ }} (syntaxe de sortie précédemment non échappée) a été remplacé par {!! !!}. Remplacer {{ }} avec {!! !!} et ça devrait marcher.

132
Ivan Topolcic

utilisez cette balise {!! texte de description !!}

13
sanjay

Inclure le contenu dans {! !}.

7
Avinash Kumar

J'ai eu le même problème. Merci pour les réponses ci-dessus, j'ai résolu mon problème. S'il y a des gens qui font face au même problème, voici deux manières de le résoudre:

  • Vous pouvez utiliser {!! $news->body !!}
  • Vous pouvez utiliser l’ouverture php traditionnelle (elle n’est pas recommandée) comme: <?php echo $string ?>

J'espère que ça aide.

5
Mehmet Sefa Balık

L'affichage de code HTML dans les modèles de lames ne pose aucun problème.

Pour le test, vous pouvez ajouter à routes.php un seul itinéraire:

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);
    }
);

et en hello.blade.php fichier:

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

{{ $content->page_desc }}

</body>
</html>

Pour le code suivant, vous obtiendrez une sortie comme sur l'image

Output

Alors probablement page_desc dans votre cas, ce n’est pas ce que vous attendez. Mais comme vous le voyez, cela peut être dangereux si quelqu'un utilise, par exemple, la balise '`;

EDIT

Je l'ai aussi testé en mettant le même code dans la base de données:

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

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

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

La sortie est exactement la même dans ce cas

Edit2

Je ne sais pas non plus si Pages est votre modèle ou un modèle de fournisseur. Par exemple, il peut avoir un accesseur à l'intérieur:

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

et puis quand vous obtenez page_desc attribut, vous aurez modifié page_desc avec htmlspecialchars. Donc, si vous êtes sûr que les données dans la base de données sont en HTML brut (non échappé), vous devriez regarder cette classe Pages

2
Marcin Nabiałek