¿Son mysql_real_escape_string() y mysql_escape_string() suficientes para la seguridad de aplicaciones?
Si bien estas funciones pueden proporcionar cierta protección contra la inyección de SQL y otros ataques , no abordan ciertas vulnerabilidades.
SQL Inyección
Mysql_real_escape_string() aún puede exponer su aplicación a inyección SQL si maneja incorrectamente las variables PHP dentro de las consultas. Considere el siguiente ejemplo:
$sql = "SELECT number FROM PhoneNumbers WHERE " . mysql_real_escape_string($field) . " = " . mysql_real_escape_string($value);
Esta consulta puede ser manipulada por un atacante para ejecutar sentencias SQL no autorizadas, ya que mysql_real_escape_string() no está diseñado para proteger nombres de tablas, nombres de columnas o campos LIMIT.
Ataques similares
Mysql_real_escape_string() es insuficiente para evitar exploits LIKE. Un atacante podría ingresar un valor malicioso como "%%" para devolver todos los registros, lo que podría comprometer información confidencial.
Explosiones de Charset
Ciertos navegadores pueden ser vulnerables a charset exploits, lo que permite a los atacantes inyectar caracteres maliciosos que evitan los mecanismos de escape y ejecutan comandos SQL arbitrarios.
Declaraciones preparadas: una versión completa Solución
Para proteger eficazmente su aplicación, se recomienda utilizar declaraciones preparadas en lugar de mysql_real_escape_string(). Las declaraciones preparadas ejecutan consultas SQL con valores proporcionados por el usuario vinculándolos como parámetros. Esto elimina la necesidad de escape manual y garantiza que solo se ejecute SQL autorizado.
Aquí hay un ejemplo del uso de una declaración preparada en PHP:
$pdo = new PDO($dsn); $column = 'url'; $value = 'http://www.example.com/'; $limit = 1; // Validate the search parameter column. $validColumns = array('url', 'last_fetched'); if (!in_array($column, $validColumns)) { $column = 'id'; } $statement = $pdo->prepare('SELECT url FROM GrabbedURLs ' . 'WHERE ' . $column . '=? ' . 'LIMIT ' . intval($limit)); $statement->execute(array($value)); while (($data = $statement->fetch())) { }
Las declaraciones preparadas ofrecen un mecanismo de defensa proactivo al aprovechar las características de seguridad del servidor de base de datos subyacente. Son inherentemente resistentes a ataques conocidos y desconocidos, lo que garantiza la integridad de sus datos.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3