php mysql security sql-injection

php - ¿Es "mysqli_real_escape_string" suficiente para evitar la inyección SQL u otros ataques SQL?



security sql-injection (1)

Este es mi código:

$email= mysqli_real_escape_string($db_con,$_POST[''email'']); $psw= mysqli_real_escape_string($db_con,$_POST[''psw'']); $query = "INSERT INTO `users` (`email`,`psw`) VALUES (''".$email."'',''".$psw."'')";

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


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

Como dice uri2x, vea la inyección SQL que evita mysql_real_escape_string() .

La mejor manera de evitar la inyección de SQL es usar declaraciones 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 la 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);

Considero que el código anterior es inmune a la inyección de SQL, incluso en casos extremos oscuros. Si está utilizando MySQL, asegúrese de desactivar las preparaciones emuladas.

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