Bonjour,
j'ai juste une question par simple curiosité
j'ai un code qui gènere des fixtures
class ArticleFixtures extends Fixture
{
public function load(ObjectManager $manager)
{
for($i=1; $i<=10; $i++){
$article = new Article();
$article->setTitle("Titre de l'article n°$i")
->setContent("<p>Contenu de l'article n°$i</p>")
->setImage("http://placehold.it/350x150")
->setCreatedAt(new \DateTime());
$manager->persist($article);
}
$manager->flush();
}
}
Comme nous pouvons le voir, la méthode setContent prend en paramètre une chaine de caractère qui contient une balise html "p"
Voici une méthode que j'appelle show et renvoie une vue dans laquelle nous accès une variable article qui contient le resulat de $article
/**
*@Route("/blog/{id}", name="blog_show")
*/
public function show($id){
$repo = $this->getDoctrine()->getRepository(Article::class);
$article = $repo->find($id);
return $this->render('blog/show.html.twig',[
'article' =>$article
]);
}
Voici la vu de la méthode show()
{% extends 'base.html.twig' %}
{% block title %}Articles{% endblock %}
{% block body %}
<section class="articles">
{% for article in articles %}
<article>
<h2>{{article.title}}</h2>
<div class="metadata"> Ecrit le {{article.createdAt | date('d/m/Y')}} à {{article.createdAt | date('H:i')}}</div>
<div class="content">
<img src="{{article.image}}" alt="">
{{ article.content | raw }}
<a href="{{path('blog_show', {'id': article.id})}}" class="btn btn-primary">Lire la suite</a>
</div>
</article>
{% endfor %}
</section>
{% endblock %}
Comment nous pouvons le voir pour pouvoir afficher la valeur de article.content j'ai dû passé en paramètre un filter raw car en effet si je ne le met pas symfony m'affiche le contenu de article.content avec les balises html "p"
Ma question est :
Qu'est-ce qu'il se passerai si un utilisateur malintensionné injécté du code htlm dans mon formulaire, est-ce que ce code serait exécuté ?
Moi je pense que oui, mais j'aimerai avoir votre avis.
Et si oui !
Quel serait la solution dans Symfony ?
Tu pourrais utiliser un eventSubsricber pour encoder tes htmlentities au moment du flush en base de données, comme ca meme s'il y a une injection de code il ne sera pas éxécuté.
Et idem lors de la récuperation en base, ton subscriber le décode.