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_data
contiene<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_string
en la cadena antes de insertarla en su consulta SQL (pero no cuandoecho
eso). -
Llamar a
htmlspecialchars
en la cadena antes de mostrársela al usuario (pero no cuando la coloca en la base de datos).