Bonjour, j'aimerai savoir comment faire la chose suivante :
J'ai un variable (php) avec du texte que j'ai extraite de ma base de donnée.
J'aimerai la faire passer dans la fonction bbcode et retrouver au final une variable php...
non, je mettais simplement [b]un texte qui contient
un retour à la ligne/b et les balises [b] s'affichaient, sans mettre en gras, mais un ami à corrigé le probleme :
au debut vous dites "il faut mettre htmlentities() pour enpecher le code html" mais alors comment je peux faire pour qu'il me fasse quand meme les sauts de ligne??
j'ai
echo ''.htmlentities(stripslashes(nl2br($data['message']))).''; et ca ne veut pas marcher, il me marque a la place des sauts de lignes maintenant. donc puis je faire pour respecter les sauts de ligne tout en empechant le code html??
Quelqu'un pourrait indiquer un BBcode pour que la balise de type [lien]....../lien détecte si son contenu est du type :
"http://www.site.fr" : ouvrir dans _blank
"page.XXX" : ouvrir dans la même fenetre
"nom@fournisseur.XX" : faire un mailto
S'il vous plaît, je comprend rien aux expressions régulière... :(
Si quelqu'un sait le faire, ce serait vraiment sympa de l'indiquer... merci encore pour votre aide !
Quand j'interprete le truc, seul, ça marche. Mais quand il y en a plusieurs, ça fait n'importe quoi... ça prend la premiere et la derniere balise j'ai l'impression.
oui il y a des risques d'injections de commande MySql lorsque les données sont enregistrées en BDD, sauf sous php4 (comme dit) car il filtre (par défaut, si on touche pas) les données transmisent.
Sinon, ou pour être sûr, un parsage des infos dont add_slach(), virer les # etc...
le must étant de faire une fonction filtre comme :
function filtre($var){
$var = ereg_replace("<","<",$var);
$var = ereg_replace(">",">",$var);
$var = ereg_replace("#","",$var);
$var = ereg_replace("$","",$var);
$var = stripslashes($var);
return $var;
}
utilisez : $texte=filtre($_POST['texte_du_form']);
je pense déjà que cela suffit. (kon me prévienne sinon)
A la question, est-il possible d'utilisez l'html en sécurité, je serais tenté de répondre non, car il y a toujours des parades aux parsage de certaine balise (script surtout), d'ou le bbcode.
libre a toi de faire autant de relation html <-> bbcode avec tes balises a toi.
Poly l'SQL INJECTION consiste a rajouter un truc dans un code comme :
mysql_query(stripslashes("SELECT id,nom WHERE pseudo='.$_[POST]['pseudo'].' AND password='.$_[POST]['password'].'"));
Si $_[POST]['pseudo'] vaut Administrateur'# le reste de ta requete après $_[POST]['pseudo'] sera considere comme commentaire a cause du # et le slash de ' sera enlevé.
Sont mieu pour eviter ce genre de trucs mais bon il doit y avoir d'autre moyen encore
mysql_query("SELECT id,nom WHERE pseudo='.$_[POST]['pseudo'].' AND password='.$_[POST]['password'].'");
mysql_query(stripslashes("SELECT id,nom WHERE password='.$_[POST]['password'].' AND pseudo='.$_[POST]['pseudo'].'"));
le code de polyprog ne peuvent pas fonctionner, et ce n'est pas ça du sql injection.
le sql injection, c'est purelent injecter du code sql dans un reuete, et depuis php4 ce n'est plus possible.
Pour info, si on envoi $sql="insert into ..."; php va le comprendre comme $php="insert into ..."
Je ne dis pas que c'est ce qui va se passer, mais c'est comme ça que php va le prendre. ce ne sera pas une variable mais une valeur. c'est different.
concernant le sql injection, ya tout ce qu'il faut comme article sur www.underground-fr.info
Pour la solution de Poly Progr@ms
Dans mon cela fonctionne parfaitement car mes requetes sql sont généré par des programme en php.
J'aimerais bien savoir comment vous faite pour vos requetes????
Dans le fichier de "include/bbcode.php" de phpBB on peut voir tous comment eux ils le font.
J'ajoute que avec preg_replace on peut utilise un tableau http://www.php.net/preg_replace
oui t'as raison, mon message était agressif, désolé, je m'en excuse. quant à la SQL injection (j'ignorais qu'on appelait ça comme ça), c'est ce dont on a parlé plus haut, et i lfaut tt de même des circonstances très spécifiques pour que ça marche. je pense qu'un tt petit peu d'attention devrait permettre de s'en prémunir aisément. (notament avec add_slashes)
bah, pas malins, je les trouve plutôt admirable ^^
ok, j'en avait entendu parler de cette option en plus, merci du rappel.
quant à la config de chaque serveur, c vrai que pafs c embetant, pr un de mes sites j'ai du éditer toutes les commandes include() pour y mettre un répertoire absolu, depuis home/ ... (ss nux) ça c énervant qd meme.
mais c bon à savoir: donc il faut utiliser ini_set pr se prémunir contre ce genre de blagues.
Merci pour l'info, ils ont encore changé la config du php.ini ! Je comprends pour les perfs mais ça impose de mettre à jour son code en fonction du serveur. La seule solution c'est d'utiliser ini_set pour fixer cette valeur soit même. Ils sont pas malins chez php parfois :(
Kirua >> Il y a un paramètre dans le php.ini qui s'appelle magic_quotes_gpc Le GPC indique GET, POST COOKIE. Si ce paramètre est sur On. Le serveur ajoute automatiquement des slashes à tous les GET, POST et COOKIE. Ce qui évite d'interpréter des mauvais codes ^^
(il est sur Off depuis les versions 4.3.x je crois pour des raisons de performance)
Pour trancher, un INSERT ne peut en aucun cas executer une autre commande passé en argument.
L'argument reste un argument, et n'est pas interpreté. c'est aussi simple que cela.
goa, je vois pas pq il ferait un addslashes lui-même, ce serait gênant en tt cas, car un langage ne devrait jamais faire ce que l'utilisateur ne lui demande pas explicitement, sinon comment faire les choses basiques quand on en a besoin ?
Bon j'ai essayé de comprendre votre problème mais j'avoue avoir un peu de mal. Quel rapport entre le commentaire contenant du BBCode et votre DROP MySQL ? Je ne vois vraiment pas comment ça peut vous gêner qu'un commenraire ressemble à une requête, vous n'allez quand même pas faire un mysql_query dessus ??? Vous faîtes un INSERT, si votre serveur PHP est bien configuré l'addslashes est automatiquement fait, si ca n'est pas le cas je vous conseille de le mettre à jour.
MySQL gère les commentaire? je pense pas, de tte façon, il faut voir la requête comme une chaîne totalement indépendante envoyée par socket au serveur SQL, c'est plus rien à voir avec PHP, le SQL est un langage à part entière, et php est l'intermédiaire. je pense pas que les commentaires soient gérés. ceci dit, j'ai jamais vérifié ça.
Perso je ne l'ai jamais fait, je vais l'éssayer dès que j'aurrais le temps.
Mais je pense qu'au bout de plusieurs essais on peut réussir à faire quelque chose.
...Mais si on rajoute le commentaire en php
"INSERT INTO table VALUES('$var')" ou var vaut " '); DROP table; //"
ça donne comme requête que le serveur SQL reçoit:
j'ai lu le contraire sur PHP.net, ça parlait de MySQL seulement, mais de toute façon je suppose que c'est ce que tu utilises.
quant à l'effacement, il suffit d'effectuer un "add slashes" pour s'en prémunir, rien à voir avec htmlentities (qui ne fait pas ça)
encore une chose: je comprends vraiment pas comment c'est possible, à part dans une requête type SELECT, puisque là les paramètres de recherche (WHERE) seront à la fin, auquel cas c'est possible en effet, mais si les paramètres sont dans VALUES lors d'une requête INSERT, je vois mal comment on pourrait arriver à une requête qui ne bug pas O_o. Exemple d'un développeur pressé ou imprudent qui n'effectue pas de add slashes:
"INSERT INTO table VALUES('$var')" ou var vaut " '); DROP table; "
ça donne comme requête que le serveur SQL reçoit:
"INSERT INTO table VALUES(''); DROP table;)"
tu vois, il y a une parenthèse de trop à la fin de la requête, et ça, MySQL ne l'acceptera pas, c'est très capricieux ^^
du moins, c'est ce que je pense et ce que j'ai pu observer, et à ma connaissance, il n'y a pas de mode "safe" avec MySQL qui le rende si pointilleux, c'est ainsi, non ?
nah je parlais des htmlentities et des nl2br, juste ça ;-) un autre avantage auquel je pense là: la place. en effet, un é occupe un octet, or après htmlentities: é bcp plus d'octets. donc pr la bdd c'est plus léger de ne pas sauve la forme transformée.
ce que je voulais dire par réutilisation, c'est tt simplement que, si tu voulais créer u option "mail" pr ton livre d'or / forum je sais pas quoi, qui envoie le message posté par mail à certaines adresses, vaudra mieux l'envoyer en mode texte (si tu n'y mets pas de bb code) auquel cas, faut pas utiliser htmlentities.
Pour une question de perfs on peut vouloir transformer avant insertion. Rien n'empêche de récupérer le BBCode original pour mettre à jour. [b] -> -> [b]. Un serait transformé en de toutes façons. -> .
j'approuve la décision de Black Wizard, il ne faut pas transformer avant d'introduire dans la BDD, si tu devais décider de changer le mode d'affichage, ça pourrait se révéler embêtant.
quant au risque d'un drop table, htmlentities de résout absolument pas le problème (pas vu de balise html DROP...) et puis, de tte manière, qd tu l'ajoute à la table, tu mets INSERT or le server sql de mySQL ne supporte pas les multi-commandes.
autre chose, tu l'ajoutes comme ça;
$requete = "INSERT INTO table VALUES('...', '...', '...', '...' ....)"
tu vois, les valeurs sont entre ' ', donc il n'y a pas d'interprétation possible
Pour les liens :
target=blank -> target="_blank", il faut mettre les valeurs entre guillements, je ne suis pas certain que blank fonctionne, en HTML c'est _blank de toutes les façons
Pour les quotes :
Il existe le tag blockquote pour les citations, on peut ajouter des bordures, changer la couleur du fond, simplement en utilisant des feuilles de style CSS. Pas besoin d'utiliser une table :)
Voilà bon code il y a quelques heures encore je me dépatouillais avec les BBCode pour un projet :).
Je pense que pour diminuer les risques de se faire suprimé les table dans les base de donné (quand un message contient par exemple: ';DROP table...;),
il faut transformer l'information avant de l'enregistrer dans la base de donnée.
OK merci.
Donc si j'ai bien compris ça donne :
//--------------------------------------------------
// POUR METTRE DANS LA BASE DE DONNEES ::
//--------------------------------------------------
$text = htmlentities($_POST["text"]);
// Ensuite on met dans la base de données
et n'oublei pas la fonction nl2br qui permet de convertir les retours chariot dans les textarea en
, c'est pr garder la mise en page, mais attention, nl2br est à mettre APRES htmlentities, sinon les
s'affichent en clair, puisque les < et > sont remplacés.
C'est exactement ce ke je recherchais merci !! ^^
Est-ce que c'est comme ça que c'est fait dans les forums comme phpbb ?
Sinon, est-ce qu'il y a d'autres codes commen celui ci qui permettent l'affichage sécurisé des balises HTML ?
j'aimerai ajouter une balise [size=xx] avec xx correspondant a un nombre entier pour remplacer par
par contre je suis nul niveau syntaxe à mettre dans le preg_replace, quelqu'un pourrais m'aider ?
A+
une vrai bete meme sur flash :p