Bonjour, je viens aujourd'hui vous présentez quelque petit morceau de code faillible
au SQL , et vous expliquez le fonctionnement .

Il s'agit d'un premier court très simpliste, on pars des bases.

Tous d’abords, voici le code tout a fait anodin fais par un webmaster quelconque :


Le code PHP/HTML :

<div class="form">
        <h1>Welcome</h1>
        <form class="input" method="POST">
                Pseudo : <input class="form-control" type="text" name="login" placeholder="pseudo"><br>
                Passsword : <input class="form-control" type="password" name="pass" placeholder="password">
                <input type="submit" value="Connexion" />
        </form>
</div>
<script type="text/javascript">
$(window).load(function(){
    $('.form').css({
        'position' : 'absolute',
        'left' : '50%',
        'top' : '50%',
        'text-align' : 'center',
        'margin-left' : -$('.form').outerWidth()/2,
        'margin-top' : -$('.form').outerHeight()/2
    });
});
</script>
<?php
        require_once('includes/site.conf.php');
        $db = new PDO("mysql:host=localhost;dbname=".DBBASE, DBUSER, DBPSWD);
        $pseudo = $_REQUEST['login'];
        $pass = $_REQUEST['pass'];
 
        $sql = "SELECT * FROM jeux_user WHERE user_login = '".$pseudo."' AND user_password = '".$pass."'";
        $sql = $db->query($sql);
        $res = $sql->fetchAll();
        $res = count($res);
 
        if($res == 0){
                echo ('Error');
        }else{
                echo ('Welcome');
        }
?>




Maintenant explicitons, dans le code suivant , voilà la requete SQL :


$sql = "SELECT * FROM jeux_user WHERE user_login = '".$pseudo."' AND user_password = '".$pass."'";



celon cette requête SQL, il faut que le user_login ainsi que le user_password soit valide.

Pour cela nous allons vérifier dans la table jeux_user qu'il y est le Login 'admin' et le password 'a', ainsi , si c'est le cas ,
ma requête va me retourner une ligne, je la stock dans un tableau :

$res = $sql->fetchAll(); 



Ensuite je compte le nombre de ligne retourner:

$res = count($res);



Puis je fais mon petit test :

if($res == 0){
	echo ('Error');
}else{
	echo ('Welcome');
}



Maintenant, je me rappel, quand SQL, nous pouvons faire passer des conditions en commentaire, a l'aide d'un '#', alors que se passerait-il
si, à la fin de mon login, je rajoutais un '#' ? admin#, il ne se passe rien, accés refuser, pourquoi ça ?

En faite, lorsque vous voulez exécuter du code SQL sur un serveur,il faut d'abord fermer la chaine de caractere, les personnes ayant déjà
fais un language de prog comprendront, pour les autres, c'est simple il suffit d'ajouter un apostrophe :

admin'#

Avec l'apostrophe, le '#' n'est plus considérer comme une chaine de caractere, et donc on peut t'injecter le code !

Voilà donc comment le server interpret la requete :

$sql = "SELECT * FROM jeux_user WHERE user_login = '".$pseudo."' // AND user_password = '".$pass."'";



Nous venons donc de mettre la condition password en commentaire, seul le login doit être a 'true'.

Pour un minimum de sécuriter vous pouvez faire votre requete en deux parties :

$sql = "SELECT * FROM jeux_user WHERE user_login = '".$pseudo."'";
$sql = $db->query($sql);
$res = $sql->fetchAll();
$res = COUNT($res);
IF($res){
        $sql = "SELECT * FROM jeux_user WHERE user_password = '".$pass."'";
        $sql = $db->query($sql);
        $res = $sql->fetchAll();
        $res = COUNT($res);
}



Et penser a utiliser la fonction htmlspecialchars pour prévenir a tout autre type de faille !