¿Es posible la inyección SQL en este script de registro de PHP? [cerrado]

0

Recientemente he creado un script de registro PHP para un sitio web en el que estamos trabajando un amigo y yo. He leído sobre los peligros de la inyección de MySQL y me preguntaba si mi código actual está protegido contra tales ataques, o si es necesario tomar medidas adicionales.

La parte relevante del código es la siguiente

  $email = $_POST['email'];
  $username = $_POST['username'];

  $username = strip_tags(trim($username));
  $email = strip_tags(trim($email));

  //Sanitation code I found somewhere..
  function mres($var){
    $conn = get_my_db();

    if (get_magic_quotes_gpc()){
        $var = stripslashes(trim($var));
    }
    return $conn->real_escape_string(trim($var));
  }

  //Sanitize username
  $sanUsername = mres($username);

  //Make SQL query
  $sql = "SELECT username FROM accounts WHERE username = '$sanUsername' ";
  $result = $conn->query($sql);

Gracias de antemano,

Shawn

EDITAR:

He actualizado la consulta SQL a la siguiente para hacer uso de declaraciones preparadas

  //Prepare statement
  $prep = $conn->prepare("SELECT username FROM accounts WHERE username = ?");
  $prep->bind_param("s", $sanUsername);
  $prep->execute();
  $result = $prep->get_result();
    
pregunta Shawn Anastasio 24.12.2014 - 07:24
fuente

1 respuesta

4

Está utilizando el enfoque incorrecto para evitar la inyección de SQL. Las entradas de desinfección pueden ayudar a proporcionar seguridad, pero la mejor manera de evitar la inyección de SQL es eliminar lo que lo permitió en primer lugar: mezclar código y datos (proporcionados por el usuario) en la misma cadena, de manera que la base de datos no lo haga. No sé qué se suponía que era un código y qué se suponía que eran datos.

Ya no hay necesidad de hacer esto en SQL, y desea ver declaraciones preparadas . La forma en que funcionan es que primero envía a la base de datos todo menos los datos reales; la base de datos compila la consulta y solo entonces proporciona los datos reales de la consulta. Lo que esto significa es que el servidor coloca los datos proporcionados por el usuario en ranuras específicas de la consulta y no puede cambiar lo que está haciendo el servidor.

Para ser más explícito, envías al servidor algo como SELECT username FROM accounts WHERE username = ? . El servidor procesa esta consulta (el preparado ), convirtiéndolo en una función que está esperando un valor para el nombre de usuario. Luego, vincula el nombre de usuario específico a la declaración y lo ejecuta. La clave es que el servidor ya sabe exactamente lo que debe hacer antes de ver los datos del usuario; nada de lo que envía un usuario malintencionado puede cambiar lo que va a hacer la base de datos (es decir, buscar filas con el nombre de usuario dado y devolver su nombre de usuario).

La desinfección de las entradas de la base de datos es fundamentalmente un intento de mitigar un vector de ataque mediante el bloqueo de las entradas que lo explotan. Las declaraciones preparadas en realidad eliminan este vector de ataque, porque eliminan las condiciones que permitieron que existiera.

Los detalles sobre cómo usar las declaraciones preparadas varían según el idioma, el marco y el servidor de base de datos; busque la documentación de PHP / MySQL para los detalles reales.

    
respondido por el cpast 24.12.2014 - 08:04
fuente

Lea otras preguntas en las etiquetas