sécuriser chaine de caractere pour login et enregistrement

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : sécuriser chaine de caractere pour login et enregistrement

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

par arthur77 » 21 août 2011, 01:28

Ok, un énorme merci ! :D

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

par AB » 20 août 2011, 21:07

... J'avoue qu'a la relecteur c'est pas très clair, je pensais cela sur la ligné de mon 1er message ^^
@+
Ton premier message était très bien, mais s'adressant à un débutant, la dernière ligne était à mon avis en trop et prête à confusion.

Il faut distinguer la sécurisation d'une requête, de l'utilisation ultérieure des données.

A la première question, on répond classiquement par l'utilisation de mysql_real_escape_string avec les extensions mysql ou mysqli, et l'utilisation préférentielle des requêtes préparées avec l'extension PDO.

A la deuxième question on répond classiquement qu'il faut protéger l'affichage avec htmlspecialchars ou autre fonction "similaire".

Mais filtrer ou convertir par avance des caractères à l'entrée en bdd, simplement pour éviter d'avoir ensuite à protéger l'affichage est une fausse bonne idée. Dans la même lignée on voit parfois des scripts qui enregistrent les données en bdd avec htmlspecialchars ou htmlentities, ce qui encombre inutilement les tables avec des entités inutiles, les rends incompatibles pour un export propre sans traitement php préalable, et en plus peut poser de gros problèmes pour la recherche ex : ce topic.


@arthur77 : il y a un tuto avec code complet ici sur l'inscription et la connexion dans un espace membre. L'enregistrement en bdd se fait avec mysql et donc l'utilisation de mysql_real_escape_string pour protéger la requête.
Si tu utiles PDO c'est le même principe excepté que tu n'utilises plus mysql_real_escape_string mais les fonctions spécifiques à PDO, ou mieux, PDO avec des requêtes préparées qui sont réputées fournir un maximum de sécurité (même si techniquement elles ne se justifient pas pour des raisons de performances dans ton script puisqu'elles ne sont pas répétées).

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

par moogli » 20 août 2011, 19:10

http://www.php.net/manual/fr/pdo.constants.php => PDO::PARAM_*

entier, chaine etc

@+

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

par arthur77 » 20 août 2011, 16:28

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

par arthur77 » 20 août 2011, 16:26

Ok d'accord je fais ça, merci beaucoup :D

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

par moogli » 20 août 2011, 14:48

$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

par arthur77 » 20 août 2011, 12:21

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

par moogli » 20 août 2011, 08:23

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

par AB » 20 août 2011, 05:29

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

par moogli » 20 août 2011, 00:00

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

par arthur77 » 19 août 2011, 23:22

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

par Mazarini » 19 août 2011, 16:22

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

par arthur77 » 18 août 2011, 21:13

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

par Mazarini » 18 août 2011, 14:55

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

par arthur77 » 18 août 2011, 13:42

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 ?