Php/mysql

Fermé
soulblacksamurai Messages postés 63 Date d'inscription dimanche 29 mai 2011 Statut Membre Dernière intervention 13 avril 2014 - 9 nov. 2011 à 12:26
soulblacksamurai Messages postés 63 Date d'inscription dimanche 29 mai 2011 Statut Membre Dernière intervention 13 avril 2014 - 10 nov. 2011 à 18:39
Bonjour,
j'ai écris ce code :
<?php
include("bddconnect.php");
mysql_select_db($database) or die("erreur de connexion a la base de donnees");
$query="SELECT password,username FROM identifiant WHERE password='".$_POST['password']."' AND username='".$_POST['username']."'";
$ok=mysql_query($query);
$row=mysql_fetch_row($ok);
if($_POST['username']!=$row[1] OR $_POST['password']!=$row[0])
{
echo 'Echec de la connexion';
}
else
{
echo 'Connexion reussi';
}
?>

Je voudrais savoir si il est vulnérable et si oui comment et si non pourquoi? Vu que je n'est pas utilisé PDO il devrait l'être cependant lorsque je test un type d'injection SQL elle ne fonctionne pas. On peut m'expliquer ?
merci


2 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié par Reivax962 le 9/11/2011 à 15:58
Bonjour,

Alors, j'aurais plusieurs remarques sur ton code, pas toutes en rapport avec la sécurité.

- Pour les injections SQL, une règle de base, c'est de ne jamais JAMAIS mettre directement $_POST[] dans l'écriture de la requête.
Tous les champs texte non transformés doivent être échappés au moyen de la fonction mysql_real_escape_string().

- Ta base de données est fragile, car les mots de passe n'y sont pas cryptés. Le cryptage md5() est simple à réaliser et n'est pas réversible (sauf par dictionnaire... on peut donc le « saler » en modifiant la chaîne à l'entrée).
Il suffit d'utiliser la fonction php md5() pour réaliser le cryptage, à l'insertion / modification des données de l'utilisateur, ainsi qu'à la lecture.

- Dans ton code, tu testes deux fois si login et mot de passe sont bons : une fois dans la requête, puis une fois sur le résultat de la requête. Ce deuxième test ne sert à rien.

Du coup, à ta place, je mettrais le code suivant :
<?php 
  include("bddconnect.php"); 
  mysql_select_db($database) or die("erreur de connexion à la base de données"); 
  $username = isset($_POST['username']) ? mysql_real_escape_string($_POST['username']) : ''; 
  $password = isset($_POST['password']) ? md5($_POST['password']) : ''; 
  $query = "SELECT username FROM identifiant WHERE password = '$password' AND username = '$username'; 
  $ok = mysql_query($query); 
  $row = mysql_num_rows($ok); 
  if($row == 0) 
  { 
    echo 'Echec de la connexion'; 
  } 
  else 
  { 
    echo 'Connexion réussie'; 
  } 
?> 
0
soulblacksamurai Messages postés 63 Date d'inscription dimanche 29 mai 2011 Statut Membre Dernière intervention 13 avril 2014 3
10 nov. 2011 à 18:39
Mias crypter c'est quoi exactement ? Pourquoi ma bdd est plus fragile sans ? Peux tu me montrer la manière de "pirater" ce code par un exemple ?
Parceque pour l'instant je connais quelques façon d'écrire ce genre de code (identifiaction, bdd etc....) et de les sécurisés mais sans comprendre le "pourquoi du comment".
Ces réponses m'aideraient beaucoup.
Merci de ton aide !

(PS: merci pour l'amélioration du code)
0