Forum Clubic

[PHP/MySQL] interdire le code htlm javascript

J’ai fait un script mais les gens peuvent envoyer du code en le collant dans les champs text etc…
genre javascript

<script>alert("boulet");setTimeout("window.location='http://www.perdu.com'",0);</script>

et j’aimerai interdire ça

quel solution dois je prendre?

Utilise peut être la donction preg_replace
http://fr.php.net/preg_replace

en transformant par exemple les balises de scripts en commentaires html par exemple; ou en supprimant ce qu’elle contiennent

Cependant ce n’est peut être pas la plus “belle” solution

htmlentities()[/url] et [url=http://fr2.php.net/manual/fr/function.htmlspecialchars.php]htmlspecialchars()

htmlentities :wink:

edit: over grillé :ane:

merci^^

Le problème c’est que ca restera affiché, ca sera enregitré dans la base de donnée si c’est le cas, en bref je trouve ca encore moins propre que ma solution : donc autant virer le script tout de suite.

<?php
$msg=preg_replace("/\<script(?:.*?)\<\/script\>/","",$msg);
?>

Ca prend en compte toute les balises commencant par "<script" et finissant par "</script>" en virant le contenu et les balises

Le problème de ta solution c’est le risque d’oublier des possibilités. Genre dans ton cas, je peux tout à fait faire un <img src="" onload=“alert(‘test’)”/> :neutre:

Bien vu :slight_smile:
La solution radicale serait donc de supprimer tout les balises (ie commencant par < finisant par >) et si il le faut implémenter une sorte de bbcode qui n’autorise que certaine chose faisable (insertion image etc…).

Tout dépend de l’utilisation du formulaire en fait.
Personnelement je préfère supprimer tout le contenu d’éventuelles balises et implémenter un bbcode si y’a besoin.

Le problème d’une regexp, c’est qu’elle invalide également les aides. Exemple le code que l’on colle ici, s’il était viré par une regex, personne ne pourrait le lire…
Et puis convertir les caractères spéciaux en entités HTML n’a jamais causé de problèmes…

Pour les scripts, le mieux reste la méthode brute :

$foo = preg_replace(’/<script\b/i’, ‘&lt;script’, $foo);
$foo = preg_replace(’/on([a-z]+)/i’, ‘on $1’, $foo);

Y a moins de chance que cela merde ainsi…

Ensuite tout dépend ce ce que tu fais, je te laisse lire les autres messages (+1 pour le bbcode)

effectivement ça laisse les les balises puisqu’elles sont enregistrer dans sql.
Mais deja ça évite que des petits malins pourrisse tout avec ça.

Je mettrais du bbcode mais seulement pour quelque truc genre commentaire etc…
les pseudo et compagni je prendrais une solution radicale interdisant toute balise
je pense que c’est la meilleurs solution.

Un bon script BBcode existe deja certaine, vous avez quelque noms?

Pour la partie formulaire y’a ca :
http://www.editeurjavascript.com/scripts/s…aires_3_318.php

Pour la partie PHP et décodage du bbcode tu peux faire comme ca par exemple (avec deux retours arrières ici pour l’exemple) :


function decode_bbcode($msg)
{
$search = array("/\[url=(.*?)\](.*?)\[\/url\]/",   autre bbcode  ,    autrebbcode etc )
$replace = array("<a href=\"\\1\">\\2</a>", autre chg, autre chg ...);
$msg=preg_replace($search,$replace,$msg);
return($msg);
}

Juste queleques petite questions pour comprendre ton probleme:

  • quelles sont les genres de code javascript (ou attaque) que tu craint a travers ces champs ?

  • dans quel "environnement" de ton site sont utilisé ce(s) champs texte ?

inscription et profils
le genre de code javascript que j’ai mis plus hauts essentiellement

ok, vu que c’est pour un forum (je presume) ca fait partie de son compte privé, de ce fait il n’y a que lui qui pourra avoir accès à ces “code” javascript

De plus le javascript est du scripting executé coté client, de ce fait je pense pas qu’il puisse avoir accès au serveur de ton site web enfin je me trompe peut-etre.

Donc pour moi, la limitation d’un script javascript reste la machine de l’utilisateur

Voila, j’espere avoir ete assez clair

Ce n’est pas pour craindre une attaque du serveur ou autre, mais pour éviter de faire tu tords aux autres utilisateurs (pense a du javascript mis dans une signature par exemple qui affiche une fenetre en boucle, renvoit vers d’autres sites etc …).

Sinon oui le javascript s’exécute du coté client, mais il peut très bien avoir une influence sur le serveur (imagine un XMLHttpRequest en boucle par exemple, qui est prévu pour faire des requètes auprès du serveur). Donc je partage pas le fait que la limitation du javascript soit la machine de l’utilisateur :slight_smile:

je c bien moi non plus j’aime pas le javascript

moins je peut m’en servir mieux je me porte ^^

Le javascript utilisé à bon escient est une très bonne chose et est à mon avis un complément indispensable pour un site un tant soit peut "évolué" et quelque soit son language coté serveur.

On voit bien de plus en plus son utilisation et sa nécessité dans les sites à fort contenu dynamique (j’aime pas le terme “web 2.0” et “AJAX” :slight_smile: )

La fonction htmlentities remplace le < par &lt; et le > par &gt;, de ce fait le script n’est pas exécuté.

On est d’accord, mais le contenu de ce qui devait être un script est affiché “à l’écran”, d’où il est mieux de l’effacer complètement (ce dont on a parlé en haut) pour éviter cet éventuel désagrément.