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é] Injections SQL


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 5
    Points : 4
    Points
    4
    Par défaut [Sécurité] Injections SQL
    Bonjour,

    Depuis peu, des gens pas très cools me font des injections sql par le biais de page de connexion sur mon serveur. J'ai lu la doc sur le cross site scripting mais je reste coincée au niveau de l'intégration de htmlspecialchars dans mon code. Au lieu de m'afficher le texte normal, il m'affiche tout ainsi que le nom des balises sur ma page !!!

    Au départ j'avais ce code là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (!$_SESSION["membre_prive"]) {
     
    $affiche_login ="Utilisateurs privés : &nbsp;Identifiant &nbsp;<input id='id' size='16' name='id' /><br />Mot de passe &nbsp;<input id='motdepasse' type='password' size='10' name='motdepasse' /> &nbsp;<input type='submit' value='Go' name='submit2' /><br />Pas encore <a href='./membres.php'>membres ? </a>&nbsp;<a href='./Aide.php'>Besoin d'aide ?</a>";
       }
       else
       {
    $affiche_message ="<FONT SIZE='1' FACE='Arial' COLOR='#426F85'><B>&nbsp; Bonjour !</B></FONT>";
    Tout s'affiche normalement, mes input sont niquels etc...
    Puis j'ai mis à jour.. Et maintenant mes input ne s'affichent plus en "graphique" html mais en texte !!! Et les autres balises pareil du genre <font face="verdana">Bonjour !</font> au lieu de juste "bonjour !" Je suis vraiment perdue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (!$_SESSION["membre_prive"]) {
     
    htmlspecialchars($affiche_login);
    $affiche_login = htmlspecialchars("Utilisateurs privés : &nbsp;Identifiant &nbsp;<input id='id' size='16' name='id' /><br />Mot de passe &nbsp;<input id='motdepasse' type='password' size='10' name='motdepasse' /> &nbsp;<input type='submit' value='Go' name='submit2' /><br />Pas encore <a href='./membres.php'>membres ? </a>&nbsp;<a href='./Aide.php'>Besoin d'aide ?</a>", ENT_QUOTES);
       }
       else
       {
    htmlspecialchars($affiche_message);
    $affiche_message = htmlspecialchars("<FONT SIZE='1' FACE='Arial' COLOR='#426F85'><B>&nbsp; Bonjour !</B></FONT>", ENT_QUOTES);

  2. #2
    Membre habitué
    Homme Profil pro
    Mickaël
    Inscrit en
    Mai 2003
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Mickaël
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2003
    Messages : 106
    Points : 133
    Points
    133
    Par défaut
    Salut,

    Je ne comprends pas trop le rapport entre ton problème d'injection SQL et le code que tu donnes.

    Pour les injections SQL, quand tu récupères des variables ( $_GET ou $_POST) tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tavariable = addslashes( $_GET[ "ta variable" ] );
    Ensuite quand tu dois l'afficher, tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tavariable = stripslashes( $tavariable );
    Ca devrait résoudre une grosse partie de tes soucis car cela va ajouter des slashes avant les quotes par exemples.

    Mickaël

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    C'est quoi cette manie de toujours vouloir appliquer des stripslashes() sur les variables en sortie de la base de données ?!
    J'ai du voir ça une bonne douzaine de fois au moins...

    Si les variables ont été correctement échappées avant insertion dans la BDD, alors aucun antislash ne doit être enregistré.
    Généralement les gens utilisent un addslahes() en plus d'avoir les magic_quotes_gpc activées, ce qui fait qu'il y a un double échappement : en effet les magic_quotes ajoutent automatiquement un autre addslashes().
    Du les variables PHP se retrouvent avec 3 antislashs au lieu d'un seul et ça oblige à appliquer un stripslashes() en sortie...
    Si je rentre dans un formulaire (ou dans une variable dans l'URL) :
    "test"

    Avec les magic_quotes_gpc ça deviendra :
    \"test\"

    Et en plus le second addslashes() :
    \\\"test\\\"

    Absurde non ?!

    Quant à la fonction htmlspecialchars() ou htmlentities(), on l'utilise après enregistrement, et non avant insertion dans la BDD, sinon on enregistre plein de caractères supplémentaires pour rien...

    Autre chose encore : pour échapper les données, utilisez la fonction spécifique à votre BDD, et non addslashes(). Avec MySQL, il s'agit de mysql_real_escape_string().
    Petit exemple avec un formulaire :

    Code "PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    if (!empty($_POST['var_1']) and !empty($_POST['var_2']))
    {
    	// on enlève les espaces en début et en fin de chaîne :
    	$var_1 = trim($_POST['var_1']);
    	$var_2 = trim($_POST['var_2']);
    	// Si les magic_quotes sont activées, on enlève les antislashs
    	if (get_magic_quotes_gpc())
    	{
    		$var_1 = stripslashes($var_1);
    		$var_2 = stripslashes($var_2);
    	}
    	// Maintenant on peut échapper proprement les var
    	$var_1 = mysql_real_escape_string($var_1);
    	$var_2 = mysql_real_escape_string($var_2);
    	// ..... OK pour insertion dans la BDD
    }

    Bon, pour en revenir au problème de sway, je doute que ta faille se trouve dans le morceau de code que tu nous a montré, en effet ce sont juste des chaînes de caractères que tu initialises toi même, elles ne contiennent aucun élément issu du navigateur du visiteur...

    Protège toutes tes données issues des $_POST, $_GET et $_COOKIE comme avec mon exemple ci-dessus (si tu utilises MySQL bien sûr) et tu devrais être bien protégé contre les injections SQL (Pense aussi à intval() pour tes variables contenant un nombre entier).

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    En fait apparemment d'après notre administrateur réseaux, la hackeur passe par cette page là pour faire son cross site scripting et tout casser ! Donc je me demandais s'il ne passait pas sur le serveur en envoyant des commandes par le biais de la case input du mot de passe et du login...

    Je ne comprends vraiment pas j'ai bien veillé à mettre $_GET ou $_POST mais je vais rajouter $tavariable = addslashes( $_GET[ "ta variable" ] );

    En tout cas merci pour les réponses rapides !!!!

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 132
    Points
    132
    Par défaut
    Si il y a injection sql ou cross site scripting, ce n'est pas sur cette page, mais sur l'action page du login, si un hacker met des choses bizarres dans les champs id et password.
    Un truc tout bête : contrôler la longueur des champs du formulaire. Si la longueur de l'id dans la bdd est 10, il ne faut pas accepter plus de 10 caractères. Idem pour le mot de passe.
    On peut aussi chercher des mots comme SELECT, INSERT, DELETE, =, " ", null, not ... le plus simple est de limiter les caractères autorisés à l'inscription et de contrôler ça au login ...
    mais bon, tout ça doit être dans la faq ...

  6. #6
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    http://a-pellegrini.developpez.com/t...tyle/#LIII.1.6

    PDO c'est bien aussi pour gérer les acces en base de donnée.

Discussions similaires

  1. Sécurité - Injection Sql
    Par bouuuh dans le forum Langage
    Réponses: 5
    Dernier message: 22/10/2011, 14h44
  2. [MySQL] Sécurité injection sql
    Par Souri84 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 26/11/2010, 14h10
  3. [Sécurité] protections php pour XSS, injections SQL, etc
    Par nintendoplayer dans le forum Langage
    Réponses: 1
    Dernier message: 20/03/2008, 08h57
  4. [Sécurité] Injection SQL
    Par Michel_57 dans le forum Langage
    Réponses: 17
    Dernier message: 19/04/2006, 00h25
  5. Sécurité - Inject SQL et %
    Par bigsister dans le forum Requêtes
    Réponses: 14
    Dernier message: 01/04/2006, 09h34

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