8796 sujets

Développement web côté serveur, CMS

Bonjour,

Je suis en train de concevoir un site qui permet aux graphistes de partager et de commenter des bouts de code HTML & CSS.

Les utilisateurs doivent pouvoir poster du code via deux textareas, un pour le HTML, un pour le CSS. Derrière, je dois vérifier grâce à une fonction PHP qu'il s'agit bien de du bon langage et surtout éviter l'injection de code PHP ou toute autre forme de langage qui pourrait constituer une faille de sécurité.

Existe-t-il une ou plusieurs fonctions qui pourrait me permettre de faire ça ?
Merci d'avance.
Modifié par tymc (13 Feb 2011 - 15:34)
Oui.
Va sur google et cherche respectivement:

-regex php html code
-regex php css code

Tu trouveras un tas de regex tout prêts!
Je vais regarder pour les regex,mais je ne trouve aucun code adapté. Je veux vraiment conserver le code HTML posté et vérifier qu'il n'y a pas de PHP.
Je crois que j'ai trouvé, mais j'ignore si c'est suffisant niveau sécurité...


$remove_php_regex = '/(<\?{1}[pP\s]{1}.+\?>)/Us';
$remove_php_replacement = '<!-- // \\1 //-->';
 
$html_wo_php = preg_replace($remove_php_regex, $remove_php_replacement, $html_w_php);

Source :http://www.ozzu.com/programming-forum/regex-php-remove-php-code-from-string-t54113.html
Salut,

Filtrer le code php ne sert à rien. Je ne sais pas comment tu stocke le code css et html mais à partir du moment où tu ne t'amuses pas exécuter les chaînes de caractère qui les composent, il n'y a aucun risque.
Quand je dit exécuter c'est appeler eval ou faire un include du fichier au lieu d'utiliser file_get_contents.
Au pire ça affichera un code php, mais ce sera peut-être voulu :o).
a écrit :
Filtrer le code php ne sert à rien.

Malheureux !
Déjà qu'en essayant de nettoyer tout ce qu'on affiche, on a parfois des surprises...
C'est une bonne pratique élémentaire pour éviter les vulnérabilités. Ce serait dommage de faire exécuter du code js (entre autres) malicieux par un de tes visiteurs.
Il s'agit d'un site qui permettra à des novices en CSS de récupérer des bouts de code (snippets) pour créer leur site, une sorte de banque de snippets.

Chaque utilisateur pourra poster un bout de code HTML + un bout de code CSS.

Derrière, je veux stocker ces bouts de code dans ma base de données, vérifier que ces bouts de codes sont intéressants, bien codés et utilisables par n'importe qui; si c'est le cas, je les confirme pour qu'ils s'apparaissent en front-office et que les gens puissent les récupérer.

Il faut juste que je m'assure via une vérification en PHP, qu'aucune injection JS, PHP ou HTML bizarre ne soit introduites lors d'une soumission. J'avais pas pensé au Js, mais comme le précise Paolo, c'est très important.

Sinon, j'ai aussi pensé à la solution suivante, dites moi si c'est viable :
j'utilise simplement une fonction classique de nettoyage de chaîne, genre :

function nettoyerChaine($chaine) {
	$chaine = str_replace( "'", "", $chaine);
	$chaine = htmlentities($chaine);
	$chaine = stripslashes($chaine);
	return $chaine;
}


Comme ça dans mon back-office, je pourrai afficher les codes qu'on m'a envoyé pour les visualiser et les confirmer. Après confirmation, je réutilise une fonction pour réécrire en HTML... Seulement, je suis bien incapable d'écrire une telle fonction... Smiley decu

C'est un peu l'horreur la programmation quand on s'y connait qu'à moitié Smiley ravi
Modifié par tymc (14 Feb 2011 - 11:39)
La première chose à faire est d'échapper les donnée avant de les enregistrer en BDD pour éviter les injections SQL.

Ensuite utiliser la fonction htmlentities() à l'affichage pour éviter l'exécution d'éventuels codes malicieux (XSS).

Dans l'absolu ces deux fonction suffisent à dresser une première sécurité. Mais cela ne remplace pas une validation humaine.
Merci pour vos réponses. Je vais utiliser une vérification standard pour éviter tout hacks puis une validation humaine des codes envoyés. comme ça on est sur !

Merci pour vos réponses.
Modifié par tymc (14 Feb 2011 - 20:37)
Bon, on va fixer les choses dans ce dawa.
Il y a plusieurs niveaux de sécurité, correspondant grosso modo à plusieurs types de failles possibles.

SQL injection
Pas de secrets, certains caractères sont à échapper. Pour ça, utiliser les requêtes préparées PDO si possible, au pire, la méthode quote de PDO. Si on est encore sous l'API mysql_ (mal), mysql_real_escape_string. Ceci est à appliquer aux chaînes. Aux entiers, décimaux, et consorts, un transtypage brute est plus efficace, rapide et moins coûteux.

XSS
C'était le sujet initial, et ça n'a rien à voir avec du code PHP. Pour être exécuté, du code PHP doit passer par l'analyseur. Pas de crainte à ce coté.
htmlentities présente quelques manques, lui préférer htmlspecialchars. Et ça, c'est à l'affichage, pour éviter les codes HTML/JS, pas autre chose ! Imagines je rentre dans une zone de texte que tu affiches sur chaque page une redirection meta vers mon site. Cool, ton site devient un satellite, merci pour l'afflux de visiteurs. Autoriser le HTML, c'est se tirer une balle dans le pied, ou s'exposer à un long développement (ou recherche de ce qui est déjà fait) pour éviter ça.
A l'affichage, car la mauvaise habitude qui a été prise de mettre du htmlspecialchars à l'enregistrement n'est historiquement qu'une mesure palliative à un bug dans phpmyadmin. Un comble. Maintenant, question: combien pèse "é" en base, par rapport à "&eacute;" ? Z'avez 10 minutes.

Tu veux sécuriser ? Ces deux failles doivent être bloquées, tu as les méthodes.

Quant à l'histoire du "hack en envoyant du PHP", lawl. Ca arrive éventuellement en envoyant un fichier PHP à un système d'upload codé avec un doigt de pied et demi, ou sur les systèmes de templates où tu laisses l'utilisateur faire du shell_exec s'il en a envie. A la limite.