sql >> Base de Datos >  >> RDS >> Mysql

¿Es mysqli_real_escape_string suficiente para evitar la inyección de SQL u otros ataques de SQL?

¿Alguien podría decirme si es seguro o si es vulnerable al ataque de inyección SQL u otros ataques SQL?

No. Como dice uri2x, vea Inyección de SQL que evita mysql_real_escape_string() .

La mejor manera para prevenir la inyección de SQL es usar sentencias preparadas. Separan los datos (sus parámetros) de las instrucciones (la cadena de consulta SQL) y no dejan espacio para que los datos contaminen la estructura de su consulta. Las declaraciones preparadas resuelven uno de los problemas fundamentales de la seguridad de las aplicaciones .

Para situaciones en las que no puede usar declaraciones preparadas (por ejemplo, LIMIT ), usar una lista blanca muy estricta para cada propósito específico es la única forma de garantizar seguridad.

// 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);

Postulo que el código anterior es inmune a la inyección de SQL, incluso en casos extremos oscuros. Si usa MySQL, asegúrese de desactivar los preparativos emulados.

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