Securiser $_POST wysiwyg html

Summernote & php

a marqué ce sujet comme résolu.

Bonjour, je viens d'installer summernote comme éditeur WYSIWYG pour un système de messagerie. Conformément à ce que j'ai lu sur divers forum, je passe le contenu de l'éditeur de texte à travers HTMLPurifier. Cela supprime effectivement les balises <script> ou <iframe>, cependant si j'entre <img src="/deconnexion.php" />, j'arrive à déconnecter le destinataire du message.

Que faire pour supprimer cette faille ?

J'utilise HTMLPurifier tel quel (sans modifications sur la version distribuée : pas de whitelist…). Sinon je sais que real_escape_string ce n'est pas terrible, et qu'il vaut mieux utiliser PDO, mais le projet en question est volumineux et je ne souhaite pas le re-écrire entièrement.

1
2
3
require 'include/htmlpurifier/HTMLPurifier.auto.php';
$purifier = new HTMLPurifier();
$message = mysqli_real_escape_string($bdd,$purifier->purify( $message ));

ensuite un insert en base de données et pour l'affichage, juste une sortie de la ligne correspondate, sans appel de fonctions supplémentaires :

1
<?php echo $row->Message; ?>
+0 -0

outre le fait que c'est totalement déconseillé de protéger d'une faille XSS par la bdd, j'ai l'impression que comme tu n'as pas mis de configuration à ton purifier il ne cherche pas les images :

Un premier pas serait de faire

1
2
3
4
<?php
$config = HTMLPurifier_Config::createDefault();
$config->set('Core.RemoveInvalidImg',true);
$purifier = new HTMLPurifier($config);

Ensuite, je te propose d'empêcher toutes les images qui se terminent par ".php" d'une part et de forcer ton serveur à interpréter toute image de type .jpg, .png, .gif comme une image. Si tu utilises Apache, ça se fait dans le .htaccess.

escape_string c'est juste pour ne pas avoir de souçis lors de l'insertion.

J'ai changé la config d'HTMlPurifier, mais <img src="/deconnexion.php"> passe toujours à travers.

je te propose d'empêcher toutes les images qui se terminent par ".php"

artragis

Désolé je ne comprends pas. Le problème vient du fait que les utilisateurs peuvent faire charger au lecteur, via l'attribut src de l'image, n'importe quelle page du site.

escape_string c'est juste pour ne pas avoir de souçis lors de l'insertion.

HTML purifier = faille XSS = uniquement à l'affichage, pas à l'insertion en base de données. Effectivement, c'est mysqli_real_escape_string qu'il faut utiliser pour la bdd.

Le problème vient du fait que les utilisateurs peuvent faire charger au lecteur, via l'attribut src de l'image, n'importe quelle page du site.

il faut comprendre que l'attribut src fait que ton navigateur envoie directement une requête http vers l'adresse renseignée. Ce n'est pas un "problème" c'est une feature. Il faut donc interdire des src avec un fichier .php.

La vrai solution ne serait-elle pas de corriger le problème directement sur la page de déconnexion ?

  1. Passer en POST sur la déconnexion.
  2. Peut-être mettre en place un TOKEN (contre la faille XSRF).

Je serais intéressé de savoir si ce filtre fonctionne, surtout qu'il ne permettrait pas de bloquer ceci :

1
2
3
4
5
6
7
<?php
/* http://siteuser.com/image.png */
// Permanent redirection
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://sitede.stoakes.fr/deconnexion.php");
exit();
?>
+1 -0

Je viens d'essayer et ça fonctionne très bien avec l'URL Rewriting, je pense que ça doit fonctionner aussi bien en modifiant le fileType.

On n'est pas obligé de créer un fichier php, on peut créer directement une redirection dans un fichier .htacess.

1
2
3
RewriteEngine On
RewriteRule ^artragis\.png$ https://zestedesavoir.com/media/galleries/426/56dc4a1e-416b-4a9d-830d-95b45d58a17a.png [R=301,L]
RewriteRule ^A312\.png$ move.php [L]

Si je supprimais tous les attributs src des balises,ne serait-ce pas plus simple ?

Par contre j'ai lu que les regex n'étaient pas adaptées pour parser du html et qu'il valait mieux utiliser DOMdocument. Confirmez vous ça ? Est-ce que DomDocument est moins gourmand que les regex ?

En fait, il s'agit de la faille CSRF et non XSS ^^

  1. Peut-être mettre en place un TOKEN (contre la faille XSRF).

A-312

En effet, pour cela, la meilleure solution que je connaisse est de générer des tokens.

Il s'agit de chaine de caractères aléatoires pour pouvoir confirmer que la demande est légitime. Ainsi, une simple requête sur /deconnexion.php ne ferra rien s'il n'y a pas de token en paramètre.

Pour gérer tes tokens, tu peux le faire toi même, ou prendre une librairie qui le fait pour toi.

Il y a quelques temps, j'avais fait une librairie pour gérer ça. Le code étant sale, hésites pas à le modifier ;)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte