Page 1 sur 2

sécuriser chaine de caractere pour login et enregistrement

Posté : 17 août 2011, 23:19
par arthur77
Bonjour, je suis débutant dans le PHP et je fais un exercice donné par un professeur : faire un système d'enregistrement de compte d'utilisateur, puis de login, le tout sécurisé. J'ai fait tous les formulaires, inscription et login, tout fonctionne parfaitement mais je n'arrive pas à sécuriser les données que j'entre dans ma BDD ... J'utilise MySQL avec PDO. J'ai entendu parlé de htmlentities(), htmlspecialchars(), strip_tags(), addslashes(), stripslashes(), et d'autres mais je ne sais pas quoi utilisé ... J'ai lut qu'il fallait empécher l'utilisateur de mettre des balises html, php ou javascript, et j'ai lut aussi qu'il fallait protégé les ' avec des antislash \ ... pouvez-vous m'aider ? Merci :)

Re: sécuriser chaine de caractere pour login et enregistrement

Posté : 18 août 2011, 01:01
par moogli
Salut
Pour les problèmes de quote simple ou double pdo peux s'en occuper sa depand de ta façon de faire et ode quote ou requête préparée ).

Pour le reste un htmlspecialchars ou un htmlentities a l'affichage (sur les champs) devrait suffir.

A la limite le plus simple c'est quand même de vérifier si les champs comptiennent pas de caractère < ou> dans les utilisateurs ceci est réalisable avec une expression régulière ;)

@+

Re: sécuriser chaine de caractere pour login et enregistrement

Posté : 18 août 2011, 13:42
par arthur77
salut moogli !
Merci pour ta réponse,
$pdo->quote() sécurise les guillemets dans mes requette ?

oui je crois que les Regex sont une bonne idée, donc je dois empécher de mettre les > et < et sinon il y a d'autres caractères à interdire ?

Re: sécuriser chaine de caractere pour login et enregistrement

Posté : 18 août 2011, 14:55
par Mazarini
Les problèmes que l'on rencontre généralement sont :

La saisie d'un champs avec une quote.
=> Il suffit de faire le test pour voir si la requête SQL qui traite ce champ fonctionne auquel cas tout va bien. Dans le cas contraire, outre le problème de plantage de la requête SQL, des personnes pourraient en profiter avec une saisie astucieuse.

L'affichage de champ de saisie avec des doubles quote : <input ... value="toto"titi" ...>
=> outre le problème d'affichage (toto au lieux de toto"titi ), il est possible de déclencher un javascript malicieux

L'affichage de texte avec du code html, genre echo $users qui afficherai <ul>nom</ul>
=> outre un affichage modifié, on pourrait ajouter un javascript malicieux.

Re: sécuriser chaine de caractere pour login et enregistrement

Posté : 18 août 2011, 21:13
par arthur77
Mazarini, qu'elles sont donc les solutions que tu me propose pour parrer à ces problèmes ? Merci beaucoup pour votre aide :)

Re: sécuriser chaine de caractere pour login et enregistrement

Posté : 19 août 2011, 16:22
par Mazarini
Pour mysql, la fonction mysql_real_escape_string() (inutile avec PDO ?).

Pour les " dans les "value", str_replace('"','\\"',$variable)

pour les < et > dans l'affichage ou les textarea, str_replace() avec & lt; et & gt; (en supprimant le blanc)

Re: sécuriser chaine de caractere pour login et enregistrement

Posté : 19 août 2011, 23:22
par arthur77
J'ai fait plusieurs tests, et PDO sécurise tout seul les ' et les " , j'ai inséré dans la BDD, j'ai resorti, des chaines avec ces guillemets simples et doubles et aucun problème.
Je crois que je vais utiliser des regex pour détecter les > et les < comme a dit Moogli.

Merci pour vos réponses :D si vous avez d'autres idées, n'hesitez pas merci :)

Re: sécuriser chaine de caractere pour login et enregistrement

Posté : 20 août 2011, 00:00
par moogli
je que j'ai pu indiqué était pour les couples logins / mots de passes où tu peux être intransigeant en indiquant que les >< ne sont pas admis.

Par contre dans un texte c'est un peux sévère (peut plus écrire que 5<10 c'est dommage ;) ). C'est la qu'entre en piste htmlspecialchars et ses copines.

il ne faut pas confondre l'insertion en base et l'utilisation a l'affichage qui sont deux choses totalement différentes.

dans un champs mysql se fou des < et > par conte, comme en php, une chiane de caractère doit être délimiter pour que mysql sache où elle commence et où elle se termine (comme en xml / html / xhtml ou cequtuveuxML, un attribut constitué de plusieurs mots séparé d'espace non encadré de " ne sera pas complet).

c'est pour cela que tu fait
insert into matable values('mon champ texte perso a moi','mais comme je suis fort en fait, y en a deux')
et pas
insert into matable values(mon champ texte perso a moi,mais comme je suis fort en fait, y en a deux ) <= la comment MySQL peux savoir qui va où ?

a partir de la il est très simple de se dire que dans un champs de formulaire de login je vais mettre ' or 1=1;--. avec une requête "classique" cela donne select truc, machin from users where login='' or 1&1; --' le reste de la requete
le -- indiquant le début d'un commentaire et la ben ça récupère toute la table puisse que la condition est toujours réalisée (oui oui 1=1).
si tu "protège" tes ' avec \' plus de soucis :)
un article wikipedia sur les injections SQL qui explique la chose.

Après les <> ça t'emmerde qu'en html (si tu fait du PDF ou autre c'est pas forcément une gène). donc pour cela à l'affichage tu utilise htmentities ou htmlspecialchars pour remplacer tous ça par leurs entités html (&glt; par exemple pour le code ascii correspondant). Et la pas de soucis de failles (xss ?) dû au p'tit malin qui insère du JS dans les commentaires par exemple.
Pour mysql, la fonction mysql_real_escape_string() (inutile avec PDO ?).
inutilisable avec PDO, mysql_real_escape_string est "liée" à une connexion mysql
http://php.net/manual/fr/function.mysql ... string.php
Note:

Une connexion MySQL est nécessaire avant d'utiliser la fonction mysql_real_escape_string(), sinon, une erreur de niveau E_WARNING sera générée, et FALSE sera retourné. Si link_identifier n'est pas défini, la dernière connexion MySQL est utilisée.
avec PDO il faut utiliser la méthode quote ou une requête préparée et un binvalue, binparam ou bindcolumn.
J'ai fait plusieurs tests, et PDO sécurise tout seul les ' et les "
attention tous seul c'est vite dit (voir au dessus) ;)

@+

Re: sécuriser chaine de caractere pour login et enregistrement

Posté : 20 août 2011, 05:29
par AB
je que j'ai pu indiqué était pour les couples logins / mots de passes où tu peux être intransigeant en indiquant que les >< ne sont pas admis.


Nan je suis pas trop d'accord - en fait pas d'accord du tout - pour supprimer les '<' ou les '>' à l'enregistrement en bdd.

Si ça peut poser des pb à l'affichage, et bien il faut traiter le problème à l'affichage.

Il faut bien distinguer les problèmes et ne pas tout mélanger. Sinon en extrapolant un peu cela peut donner aussi l'idée d'utiliser htmlspecialchars ou htmlentities directement à l'enregistrement en bdd ce qui peut poser de gros problèmes par la suite.

Donc le principe est de (sauf exceptions rarissime) pouvoir tout enregistrer en bdd.

Re: sécuriser chaine de caractere pour login et enregistrement

Posté : 20 août 2011, 08:23
par moogli
ben, sur des choses comme un login ou mot de passe tu peux te le permettre (d'ailleurs beaucoup le font en ne demandant que des chaine alphanumérique) je n'ai pas dit qu'il fallait le faire obligatoirement.
Dans cette je pense surtout à une expression régulière de validation ou non de la chose et pas forcément une suppression pure et dure. J'avoue qu'a la relecteur c'est pas très clair, je pensais cela sur la ligné de mon 1er message ^^

@+

Re: sécuriser chaine de caractere pour login et enregistrement

Posté : 20 août 2011, 12:21
par arthur77
Donc si je résume (dîtes moi si je me trompe) : quand je fais une requette SQL je dois entourer mes chaines avec un $pdo->quote() , je peux autoriser les > et < (sauf dans pseudo/mdp ou je bloque avec une Regex) a condition de mettre htmlspecialchars ou htmlentities a l'affichage, pour éviter de déclancher notemment des scripts JS, c'est bien ça ?

Re: sécuriser chaine de caractere pour login et enregistrement

Posté : 20 août 2011, 14:48
par moogli
$pdo->quote($lavariable,letype) <= me type est important

les <> tu les "autorises" ou pas dans tous ce que tu veux même login / mdp si tu veux, le tout c'est de bien mettre un htmlentities ou htmlspecialchars avant l'affichage :)

@+

Re: sécuriser chaine de caractere pour login et enregistrement

Posté : 20 août 2011, 16:26
par arthur77
Ok d'accord je fais ça, merci beaucoup :D

Re: sécuriser chaine de caractere pour login et enregistrement

Posté : 20 août 2011, 16:28
par arthur77
juste une dernière question, "letype", c'est des types comment ? est-ce que tu sais où je peux trouver une liste ? j'ai regardé la doc sur pdo-quote() mais ils n'indiquent pas ...

Re: sécuriser chaine de caractere pour login et enregistrement

Posté : 20 août 2011, 19:10
par moogli
http://www.php.net/manual/fr/pdo.constants.php => PDO::PARAM_*

entier, chaine etc

@+