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écurité] Sécurité de connection


Sujet :

Langage PHP

  1. #1
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut [Sécurité] Sécurité de connection
    Salut,

    Je me demandais: est ce que chez tous les hébergeurs les quotes sont interdits dans le choix des pseudo et mots de passe, ou mieux faut-il que je fasse un stripslashes des données envoyées par formulaire avant de me connecter ?
    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut


    dans tous les cas, si ton SGBD est MySQL, l'utilisation de mysql_real_escape_string() est plus que recommandée pou réviter toute attaque par injection SQL... ;-)

  3. #3
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Quel est le lien entre ton hébergeur et le choix de pseudo/mot de passe dans ton application ?
    A la rigueur qu'il désactive des fonctions je veux bien, mais je vois pas comment il pourrait empecher de mettre une quote dans le pseudo du pauvre visiteur...

    Tourne toi plutot vers ton application

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dans tous les cas, si ton SGBD est MySQL, l'utilisation de mysql_real_escape_string() est plus que recommandée pou réviter toute attaque par injection SQL...
    htmlentities est encore mieux, non ? Ou en tout cas ça fait pareil, avec des trucs en bonus.
    C'est pas parce que j'ai tort que vous avez raison.

  5. #5
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Ce n'est pas du tout le même usage !
    htmlentities convertit tout caractères en entités html si possible
    alors que mysql_real_escape_string est concue spécialement pour prévenir toute injection sql.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    oui mais htmlentites prévient aussi les injections sql puisqu'elle place un / devant les '.

    Ou alors il faut que je mysql_real_escape_string les données de mes formulaires, en plus de les htmlentiter !
    C'est pas parce que j'ai tort que vous avez raison.

  7. #7
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Il n'y a pas que le ' qui soit problematique sous mysql, sinon un simple addslashes suffirait... regarde la liste des caractères qui sont échappés par la dite fonction :
    http://php.net/mysql_real_escape_string

    Et regarde l'exemple 3 =>
    Cet exemple démontre la méthode la plus propre pour envoyer une requête à la base....

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Bon

    Alors tu me conseilles de passer d'abord les variables par htmlentites puis par mysql_real_escape_string? Et comment fait-on pour afficher le message sans les / ajoutés par mysql_real_escape_string? (désolé c'est pas mon post, mais j'en profite ça m'intéresse ).

    Parce que jusqu'ici je faisais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //filtrage du contenu du formulaire
    $V=htmlentitites($_POST[V])
    //affichage dans l'espace de vérification
    $V=stripslashes($V)
    alors maintenant j'ajoute
    $V=mysql_real_escape_string($V);
    mais ça me recole des /


    Mais de toute façon, on ne peut pas injecter une requête sql sans passer par les balises <?php ?>, non ? donc comme elles sont désactivées par htmlentites, c'est fichu. Je me trompe ?

    **edit**
    Avant d'envoyer les données dans la base, je les refiltre par htmlentities après qu'elles aient été affichées à l'aide de stripslashes.


    Si je fais ça, c'est crétin, non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     $contenuC=mysql_real_escape_string($contenuC);
      $contenuC = htmlentities($contenuC);
      $contenuC=stripslashes($contenuC);
       $contenuC=stripslashes($contenuC);
        $contenuC=stripslashes($contenuC);
    //maintenant j'affiche, 
    puis avant l'insertion définitive dans la base je refais
    $contenuC=mysql_real_escape_string($contenuC);
      $contenuC = htmlentities($contenuC);
    //puis quand je récupère les données depuis la base, je les repasse par stripslashes.
    Pour la deuxième partie, ça me semble cohérent, mais pour la première, c'est un peu inutile non ?
    (L'idée est de prévisualiser un commentaire puis de l'envoyer dans la base, la première partie concerne le passage entre le formulaire et la prévisualisation, partie dans laquelle il n'y a pas encore d'insertion dans la base).
    C'est pas parce que j'ai tort que vous avez raison.

  9. #9
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Attention, ici on parle d'injection sql. '<?php' n'a rien à voir avec une requête sql.
    Personnelement je fonctionne de la manière suivante :
    L'utilisateur tape une chaine "naturelle" : L'orient
    PHP recoit et applique un coup de stripslashes suivant la configuration (magic_quotes)
    Si je sors directement $_GET['var'], j'obtient : L\'orient
    Donc je teste si magic_quotes est à on, et j'applique un stripslashes : L'orient
    A partir de maintenant je travaille, indépendemment de la config, avec une chaine naturelle.
    Je peut l'écrire directement au navigateur dans un div par exemple, je peux faire des stats dessus, ...
    Je peux aussi l'insérer dans mysql
    dans ce cas là si c'est un numeric, je touche à rien, sinon mysql_real_escape_string + j'ajoute des quotes autour
    Quand je récupère depuis la bd, apres un mysql_query, j'obtiends une chaine naturelle (sauf configuration spéciale mais je suis jamais tombé dessus)
    Je peux afficher directement la variable à l'utilisateur, ou faire des stats dessus, ou ...

    Ce scénario regarde seulement mysql. pour d'autres attaques (de tye XSS?), ils faut faire un traitement supplémentaire (strip_tags, htmlentities, ...) soit à l'affichage de la variable, soit une fois pour toute avant insertion dans la bd. Mais encore une fois, ca n'a rien à voir avec les injections sql.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Ok je ne pensais pas que l'on puisse insérer une requête sql dans un formulaire sans l'encadrer par <?php ?> (pour une page en php).

    Je viens de faire un test:
    J'ai inséré deux foisle même code pirate dans ma base de donnée : filtré une fois avec htmlentities, puis une fois avec mysql_real_escape_string.

    Dans la base, le résultat est strictement le même dans les deux cas, sauf qu'avec htmlentities, les < et autres & sont encodées, mais les / sont en même nombre au même endroit.

    J'ai quand même placé un htmlentitities($v) suivi d'un mysql_real_escape_string(), au cas où, mais est-ce utile ?
    C'est pas parce que j'ai tort que vous avez raison.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Et là je viens d'insérer le même bout de code mais en le filtrant d'abord par htmlentities puis par mysql_real_escape_string :

    Résultat strictement identique dans la base de données, par rapport à l'insertion filtrée uniquement par htmlentities.

    Conclusion personnelle et modeste : mysql_real_escape_string n'apporte aucune sécurité supplémentaire par rapport à htmlentities, au contraire puisqu'elle ne protège pas des attaques xss, mais par contre est utile pour ne pas encoder les caractères spéciaux.

    htmlentities =mysql_real_escape_string + encodage des caractères spéciaux ?
    C'est pas parce que j'ai tort que vous avez raison.

  12. #12
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    J'ai comme l'impression de parler dans le vide...
    sans savoir ce qui se trame derrière ces fonctions, analyse leur nom :
    htmlentities
    mysql_real_escape_string
    Pas besoin de tergiverser cent sept ans. deux fonctions pour deux usages différents. Tu peux mettre autre chose que du html dans une base de données, et le contenu d'une base de données n'est pas forcément à destination d'un flux html.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Bon d'accord, mysql_real_escape_string a ses raisons d'être que ma raison ignore, cela étant je viens bien de vérifier dans la base et j'insiste :

    Mon code pirate avec requêtes complètes et tout ce qui s'en suit (c'est pas le miens je l'ai récupéré sur un tutoriel, de toute façon c'est un code basique rien de plus) et bien mon code donc, est slashé de la même manière avec htmlentities qu'avec mysql_real_escape_string.

    Donc même si j'ignore les subtilités de ces fonctions, je suis en droit de penser qu'htmlentities protège la base de données des injections sql de la même manière que mysql_real_escape_string.

    Je viens de répéter pareil aussi mais bon, j'ai toujours pas compris pourquoi htmlentities est pas mieux que mysql_rea_escape_string, question sécurité pure.
    C'est pas parce que j'ai tort que vous avez raison.

  14. #14
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    C'est quoi ta requête pirate ?

  15. #15
    Membre éclairé Avatar de Death83
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 667
    Points : 878
    Points
    878
    Par défaut
    un stripstags ne suffirait pas?
    manganimes (en construction) -
    zemanga

  16. #16
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    un stripstags ne suffirait pas?
    Rien à voir, striptags sert à retirer les balises. Faut s'en servir pour éviter les vols de session cookies ect. failles XSS je croit.


    Aller Mr N., Aller Mr N., Aller Mr N., Aller Mr N., Aller Mr N.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    ça c'est ma requête pirate recopiée d'un manuel php (bien sur elle ne pirate rien, le but est juste de constater les effets des fonctions en questions sur elle, une fois qu'elle est insérée dans la base):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
     
    $query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']} '" ;
    mysql_query ( $query );
     
     
    $_POST [ 'username' ] = 'aidan' ;
    $_POST [ 'password' ] = "' OR ''='" ;
     
    echo $query ;
    ?>
    ça c'est le résultat une fois dans la base, filtré par htmlentities :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    &lt;?php
     
    $query = \&quot;SELECT * FROM users WHERE user=\'{$_POST[\'username\']}\' AND password=\'{$_POST[\'password\']}   \'\&quot; ;
    mysql_query ( $query );
     
    $_POST [ \'username\' ] = \'aidan\' ;&lt;br /&gt;
    $_POST [ \'password\' ] = \&quot;\' OR \'\'=\'\&quot; ;
     
    echo $query ;
    ?&gt;
    ça c'est le résultat dans la base, filtré par mysql_real_escape_string
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php 
     
    $query = \"SELECT * FROM users WHERE user=\'{$_POST[\'username\']}\' AND password=\'{$_POST[\'password\']}  \'\" ; 
    mysql_query ( $query ); 
    $_POST [ \'username\' ] = \'aidan\' ; 
    $_POST [ \'password\' ] = \"\' OR \'\'=\'\" ; 
    <br />
    echo $query ; 
    ?>
    Et ça c'est le résultat dans la base, filtré par les deux à la suite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    &lt;?php
    $query = \&quot;SELECT * FROM users WHERE user=\'{$_POST[\'username\']}\' AND password=\'{$_POST[\'password\']}  \'\&quot; ;
    mysql_query ( $query );&lt;br /&gt;
     
    $_POST [ \'username\' ] = \'aidan\' ;&lt;br /&gt;
    $_POST [ \'password\' ] = \&quot;\' OR \'\'=\'\&quot; ;
     
    echo $query ;
     
    ?&gt;
    J'ai juste viré les <br/> encodés ou non selon les cas.
    C'est pas parce que j'ai tort que vous avez raison.

  18. #18
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Citation Envoyé par psychoBob
    j'ai toujours pas compris pourquoi htmlentities est pas mieux que mysql_rea_escape_string, question sécurité pure.
    Voici pourquoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <pre><?php
    	$var = "L'orient";
    	var_dump($var);
    	var_dump(htmlentities($var));
    	var_dump(mysql_real_escape_string($var));
    ?>
    Ca donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string(8) "L'orient"
    string(8) "L'orient"
    string(9) "L\'orient"
    Le comportement n'est pas identique, htmlentities ne m'as pas échappé l'apostrophe => il ne protège pas des injections sql.
    CQFD

    La on va me dire qu'on peut échapper les apostrophes avec ENT_QUOTES
    Je suis d'accord, mais quid des autres caractères propres à mysql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NULL, \x00, \n, \r, \, ', " et \x1a
    :

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Oui j'ai pas tout compris mais bon, pourquoi dans ce cas, htmlentities n'a pas échappé ta chaîne?

    Et sinon... soyons pragmatique:

    Si je fais ça avant l'insertion dans la base, t'es ko ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $contenu= htmlentities($_POST['$contenu']);
    $contenu= mysql_real_espace_string ($contenu).
    C'est pas parce que j'ai tort que vous avez raison.

  20. #20
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Je sais pas ce que tu entends par ko, mais vu l'heure, oui je suis ko

    Si tu fais ça, tu transforme les caractères spéciaux html en entités (XSS?) et tu échappent les caractères spéciaux mysql (injections sql).

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 5 12345 DernièreDernière

Discussions similaires

  1. Une erreur 233 de ms sql server
    Par Hokage dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 05/10/2009, 17h40
  2. Erreur 233 sous sql server
    Par brajae85 dans le forum Oracle
    Réponses: 3
    Dernier message: 18/05/2009, 16h12
  3. Réponses: 2
    Dernier message: 05/10/2004, 22h43

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