Mysql
 sql >> Base de données >  >> RDS >> Mysql

Est-ce que mysqli_real_escape_string est suffisant pour éviter l'injection SQL ou d'autres attaques SQL ?

Quelqu'un pourrait-il me dire s'il est sécurisé ou s'il est vulnérable à l'attaque SQL Injection ou à d'autres attaques SQL ?

Non. Comme le dit uri2x, voir Injection SQL qui contourne mysql_real_escape_string() .

La meilleure façon pour empêcher l'injection SQL est d'utiliser des instructions préparées. Ils séparent les données (vos paramètres) des instructions (la chaîne de requête SQL) et ne laissent aucune place aux données pour contaminer la structure de votre requête. Les instructions préparées résolvent l'un des problèmes fondamentaux de la sécurité des applications .

Pour les situations où vous ne pouvez pas utiliser d'instructions préparées (par exemple, LIMIT ), l'utilisation d'une liste blanche très stricte pour chaque objectif spécifique est le seul moyen de garantir sécurité.

// This is a string literal whitelist
switch ($sortby) {
    case 'column_b':
    case 'col_c':
        // If it literally matches here, it's safe to use
        break;
    default:
        $sortby = 'rowid';
}

// Only numeric characters will pass through this part of the code thanks to type casting
$start = (int) $start;
$howmany = (int) $howmany;
if ($start < 0) {
    $start = 0;
}
if ($howmany < 1) {
    $howmany = 1;
}

// The actual query execution
$stmt = $db->prepare(
    "SELECT * FROM table WHERE col = ? ORDER BY {$sortby} ASC LIMIT {$start}, {$howmany}"
);
$stmt->execute(['value']);
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);

Je postule que le code ci-dessus est immunisé contre l'injection SQL, même dans les cas extrêmes obscurs. Si vous utilisez MySQL, assurez-vous de désactiver les préparations émulées.

$db->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);