Hay dos cosas muy importantes que debe hacer para evitar serios problemas de seguridad.
-
Debe escapar de la entrada del usuario antes de incluirla en su consulta SQL. Escapar significa escapar de todos los caracteres especiales como
'; por suerte, hay una función que ya lo hace automáticamente:mysql_real_escape_string .Si no escapa de la entrada del usuario, podrían suceder cosas desagradables. Imagine que su consulta es
INSERT INTO userdata VALUES ('$user_data'). Ahora imagine que el usuario escribió'; DROP DATABASE userdata;.Si no lo escapa, su consulta se convertirá en:
INSERT INTO userdata VALUES (''; DROP DATABASE userdata;'). Como puede imaginar, esto no es bueno:si tiene múltiples declaraciones habilitadas, puede despedirse de su base de datos. Esto se llama una inyección SQL ataque. -
Cuando está enviando su variable al usuario, también necesita reemplazar correctamente los caracteres especiales HTML con entidades HTML. Por suerte, también hay una función para hacerlo:htmlspecialchars() . Transformará los caracteres HTML especiales como
<a<.Este parece ser un problema que a menudo se subestima, pero en realidad es muy grave. Imagina si
$user_datacontiene<script>SomeNastyScript()</script>. Podría explotar las vulnerabilidades existentes en el navegador de sus usuarios, o podría enviar una cookie que no sea HTTPOnly (que puede contener contraseñas guardadas) al atacante, o podría engañar al usuario para que escriba su contraseña en un formulario generado a través de la manipulación de el DOM (posible en javascript), o muchas otras cosas malas.Esto se llama XSS (secuencias de comandos entre sitios).
Versión corta
-
Llame a
mysql_real_escape_stringen la cadena antes de insertarla en su consulta SQL (pero no cuandoechoeso). -
Llamar a
htmlspecialcharsen la cadena antes de mostrársela al usuario (pero no cuando la coloca en la base de datos).