# Analyse de code PHP
**Voici le code PHP donné :**
<?php
if( isset( $_GET[ 'Login' ] ) ) {
$user = $_GET[ 'username' ];
$pass = $_GET[ 'password' ];
$pass = md5( $pass );
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
if( $result && mysqli_num_rows( $result ) == 1 ) {
$row = mysqli_fetch_assoc( $result );
$avatar = $row["avatar"];
$html .= "<p>Bienvenue {$user}</p>";
$html .= "<img src=\"{$avatar}\" />";
}
else {
$html .= "<pre><br />Username and/or password incorrect.</pre>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
**Voici les vulnérabilités présente dans ce code :**
- La fonction de hashage présente est de type md5, il faut préconniser la fonction de hashage php par défault (password_hash) ou à minima avec du SHA-256 concaténé avec un sel random comme le fait la fonction password_hash.
- La fonction mysql_real_escape_string qui permet de protèger une commande SQL de la présence de caractères spéciaux n'est pas présente et cela peut permettre à un attaquant d'effectuer une injection SQL dans les champs ou dans l'URL.
- Les variables $_GET[ 'username' ] et $_GET[ 'password' ] n'est pas défini, en effet si la fonction isset() n'est pas initialisée pour ces variables un attaquant peut
- Type juggling
- La fonction htmlspecialchars() qui permet de convertir les caractères spéciaux en entités HTML ainsi que la fonction stripslashes() qui quand à elle permet de supprimer les antislashs d'une chaîn. Ces deux fonctions n'étant pas présente un attaquant peut exécuter du code arbitraire JavaScript (XSS) dans les champs du formulaire et ainsi compromettre de plusieurs façon l'application.
- SELECT * -> il faut specifier une colonne
- Le nombre de tentative n'est pas définie dans ce code, un assailant peut donc tenter de brute forcer le mot de passe. Nous vous recommandons de spécifier la variable "$_SESSION['connecte']" afin de définir le nombre de tentative. De plus, une implémentation dans la base de donnée des ip des visiteurs peut permettre de bloquer les tentatives d'ip connu :
```
CREATE TABLE visiteurs(
ip VARCHAR(15),
date TIMESTAMP,
tentatives INTEGER
);
```