Tester des injections mysql

Eléphant du PHP | 216 Messages

26 janv. 2015, 22:38

Bonjour à tous,

est-il possible de tester des injections mysql ? Je suis victime d'une deuxième attaque de hacker.
Des tables de ma base de données ont été vidée et j'aimerais connaître la faille de mon site car j'ai pas mal de formulaire.

Merci d'avance pour votre aide.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

26 janv. 2015, 22:46

Il existe des outils pour tester les injections SQL sur son site.
Les 2 plus connus sont :
- The Mole http://sourceforge.net/projects/themole/
- Pangolin : http://nosec.org/en/productservice/pangolin/

Si tu veux te protéger contre les injections SQL :
- Vérifie que toutes les variables $_POST, $_GET, $_SESSION, $_COOKIE sont bien filtrées avec var_filter()
- Dans toutes tes requêtes SQL, aucune variable ne doit être insérée sans être passée par mysql_real_escape_string() ou si tu utilises mysqli mysqli_real_escape_string()
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 216 Messages

27 janv. 2015, 11:44

Bonjour,

voici un exemple de mon code, penses-tu qu'il est protégé des injection mysql ?

// Protège la variable avant l'insertion

function quote_smart($value)
{
// Stripslashes si nécessaire
	if (get_magic_quotes_gpc())
	{
		$value = stripslashes_deep($value);
	}

// Protection si ce n'est pas un entier
	if (!is_int($value))
	{
		$value = "'" . mysql_real_escape_string($value) . "'";
	}
return $value;
}

$sqly = sprintf("delete from flatforswap_adherent where id_adh=%s", quote_smart($_GET['id']));
$reqy = mysql_query($sqly) or die('Erreur SQL : <br />'.$sqly);

$sql_des = sprintf("delete from flatforswap_destination where id_adh=%s", quote_smart($_GET['id']));
$req_des = mysql_query($sql_des) or die('Erreur SQL : <br />'.$sql_des);

$sql_log = sprintf("delete from flatforswap_logement where id_adh=%s", quote_smart($_GET['id']));
$req_log = mysql_query($sql_log) or die('Erreur SQL : <br />'.$sql_log);


Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

27 janv. 2015, 12:28

voici un exemple de mon code, penses-tu qu'il est protégé des injection mysql ?
En terme de sécurité, il vaut mieux tout de suite partir sur des bases saines, surtout vu les problèmes que tu rencontres.

filter_var() et mysql_real_escape_string() sur tous les champs sans exception, c'est simple, propre et ça évite les attaques.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 216 Messages

27 janv. 2015, 14:44

Bonjour,

mais ceci est bien fait dans la fonction suivante :

/ Protège la variable avant l'insertion

function quote_smart($value)
{
// Stripslashes si nécessaire
        if (get_magic_quotes_gpc())
        {
                $value = stripslashes_deep($value);
        }

// Protection si ce n'est pas un entier
        if (!is_int($value))
        {
                $value = "'" . mysql_real_escape_string($value) . "'";
        }
return $value;
}

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

27 janv. 2015, 15:34

Que veux-tu que je te dise...
Moi je veux bien te répéter la même chose plusieurs fois et dans différents sujets mais à un moment, il faut que tu fasses un effort.

Pour sécuriser ses variables, il faut :
1) les filtrer pour être sûr qu'elles soit dans le format attendu.
Et PHP a une fonction dédiée à ça qui s'appelle filter_var() (et que tu n'utilises pas dans ton code)

2) les protéger quand tu les utilises dans une requête SQL. Et ça il faut le faire pour toutes les variabes que tu passes dans une requête (pas de if is_int ou je ne sais quoi).
Et là PHP a plusieurs solutions suivant la façon dont tu te connectes à MySQL :
- mysql_real_escape_string()
- mysqli_real_escape_string()
- PDO - prepare()


Dégage ta fonction quote_smart() et refait ton code proprement sur la base des 2 bonnes pratiques que je t'ai indiqué.
C'est la 3ème fois que je te le dis dans ce sujet et 2 fois dans ton sujet précédent, après j'abandonne :)
A toi de bosser.
Quand tout le reste a échoué, lisez le mode d'emploi...

ViPHP
ViPHP | 928 Messages

27 janv. 2015, 15:58

Ca fait déjà des années qu'il ne faut plus utiliser mysql_query() mais PDO et les requêtes préparées. Pour rappel, PDO a été ajouté avec PHP 5 en 2004 ... c'est à dire il y a 11 ans !

Voici comment faire une requête totalement protégée des injections SQL avec PDO :
$pdo = new PDO('mysql:dbname=NOM_DE_LA_DB;host=localhost', 'username', 'password');
$pdo->prepare('delete from flatforswap_adherent where id_adh = :id');
$pdo->execute(array(
   'id' => $_GET['id'],
));
En ce qui concerne les magic quotes, ils ont été supprimé avec PHP 5.4, donc tu n'as plus besoin d'appliquer stripslashes() à tes variables.

Eléphant du PHP | 216 Messages

28 janv. 2015, 15:16

Merci Genova pour ton exemple, je vais m'en inspirer.

J'étais persuadé d'être protégé des injections mysql lorsque j'ai codé mes requêtes car je me suis inspiré de ce code :
mais je me rends compte avec vos remarques qu'il ne protège pas du tout des injections et j'en ai fait les frais...

Je vais donc me mettre à PDO.

Merci encore pour votre aide.

ViPHP
ViPHP | 928 Messages

28 janv. 2015, 15:49

Malheureusement de très nombreux articles périmés traînent encore sur internet, le monde du développement web évoluant à une vitesse folle. Dans l'absolu cette méthodologie n'est pas mauvaise, elle est simplement dépassée. PDO est la seule chose à utiliser aujourd'hui.