IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Sécurisation de variables


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Par défaut Sécurisation de variables
    Bonjours à tous et à toutes.

    Je reviens de php.net et je suis un peu paumé par rapport à toutes les commandes de sécurisation de variable, entre htmlspecialschars, htmlentites, mysql_......
    Donc voila, je vais définir quelques situations, et je voudrais juste savoir si j'ai choisie les bonnes fonctions pour ça =)
    Pour chaque situations, la première ligne serra pour l'enregistrement (E: -> mysql_query(....), la seconde serra pour l'affichage (A: -> echo ...).
    Ps: oublions que les magics quotes existent pour ce cas

    1) Une variable de pseudo (alphanum + "-" + "_")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    E: regex "preg_match('#^[0-9A-Za-z-_]*$#',$var)" 
      //et si ça passe-> 
    mysql_real_escape_string($var)
    A: htmlentities($donnees['var'], ENT_QUOTES) //($donnees ou $_POST)
    2) Un variable de mot de passe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    E: md5($var)  [ça suffis ?]
    A : if($donnees['var'] == md5($_POST['pass']))
    //Je préfère ne sélectionner que le nom d'utilisateur dans la table et vérifier le pass par la suite.

    3) Une chaine de caractère sans html interprété (style chat)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    E: mysql_real_escape_string($var)
    A: htmlentities($var, ENT_QUOTES)
    4) Une chaine de caractères html (partiel) autorisé (style forum)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    E: mysql_real_escape_string(stiptags(bbcode($var)))
    A: bbcode_decode(stripslashes($var));
    //bbcode() & bbcode_decode() -> fonction perso qui remplace les balises autorisées en bbcode
    5) une chaine de caractère html (complet) autorisé (style backend news (editeur WYSIWYG))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    E: mysql_real_escape_string(htmlentities($var)) 
    A: html_entity_decode(stripslashes($var)) [ou htmlspecialchars là ?]

    Si vous voyez d'autre situations, ou que vous avez d'autre conseil, je suis preneur

    Merci d'avance


    Edit: ah ouais, et aussi: pour faire un cookie "sur" il faut faire un id compliqué.
    un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sha1(md5($user['ip_denregistrement']).$user['password'].md5($user['date_denregistrement']))
    Vous parrait il correct ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 62
    Par défaut
    Salut,

    avant tout, la sécurisation de variables est nécessaire afin de prévenir des attaques XSS.
    Elle consiste en filtrage de variables en provenance de l'internaute.

    Tes scripts cas par cas :

    1. OK. Mais attention à l'utilisation de htmlentities à l'affichage.
    Si les données retournées par htmlentities() sont utilisées pour un formulaire,
    A l'affichage on verra bien des caractères spéciaux ( é,à,etc...) mais lors de la soumission du formulaire
    on aura é ou à . Faudra penser à les reconvertir.

    2. OK.

    Une solution encore plus poussée que j'ai vu sur Joomla consiste à générer une clé unique par utilisateur,
    avec uniqid() par example, et faire un md5 avec -> md5( $user_passe . $user_uniqid ).
    La clé, bien sûr, doit être sauvegardé dans la BDD sinon - impossible de vérifier le mot de passe.

    3. OK
    4. OK
    5. Inutile de convertir un texte formaté HTML avant de sauvegarder. mysql_real_escape_string() suffit largement.
    Par contre il serait bien de tester la presence de cetraines balises html ( <script>,<flash>, <frame> ou autre ).
    Si ces balises sont autorisés faudra jeter un coup d'oeuil sur leurs contenu avant de publier cet enregistrement sinon les effacer.

    6. Generation de cookie - OK.

    Just un conseil d'optimisation.
    J'imagine que tu veux logger automatiquement un utilisateur avec un cookie "sur".
    Génère la valeur de ce cookie lors de la création d'un compte utilisateur et
    enregistre cette valeur dans la table des utilisateus avec un Index sur ce champ dans la BDD ( memo : la recherche est plus rapide avec Index ) .
    comme ça tu n'aura qu'à vérifier si la valeur du cookie existe dans la table des utilisateurs.
    ça t'evitera de calculer la valeur de cookie pour tout tes utilisateus à chaque fois que une page du site se charge.
    La reponse du serveur sera plus rapide et MYSQL moins chargé.

    J'espère que ma réponse te sera utile,
    Konstantin

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Par défaut
    Merci beaucoup, c'est exactement la réponse que j'attendais
    Je cours finir de sécuriser mes scripts

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 191
    Par défaut
    juste pour info, dans php6 les librairies mysql* ne seront plus active par défaut donc à forciori mysql_real_escape_string().

    il faut songer à migrer en PDO pour etre tranquille.
    sachant que en requete préparée la doc affirme qu'il ne peut y avoir d'injection sql après pour les injection xss je sais pas

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    la doc affirme qu'il ne peut y avoir d'injection sql après pour les injection xss
    les injections xss n'ont rien a voir avec les bases de donnée.
    par contre effectivement PDO avec les requetes préparées sont l'avenir en PHP et offrent un niveau de protection superieur (a condition évidemment de les utiliser convenablement)
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sécuriser vos variables utilisateurs
    Par morgan47 dans le forum Langage
    Réponses: 1
    Dernier message: 07/12/2012, 18h10
  2. Sécuriser des variables
    Par J_Lennon dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 11/01/2010, 14h07
  3. Sécuriser une variable
    Par max33370 dans le forum ASP.NET
    Réponses: 6
    Dernier message: 11/12/2009, 14h50
  4. [RegEx] Sécuriser une variable
    Par damien_dd dans le forum Langage
    Réponses: 5
    Dernier message: 26/10/2009, 15h12
  5. [Sécurité] Sécuriser les variables
    Par snyfir dans le forum Langage
    Réponses: 3
    Dernier message: 24/06/2007, 15h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo