2011-02-15 17 views
5

Estoy pasando algunos datos de usuario simples en una base de datos mysql.Es urlencode() lo suficientemente bueno como para detener todos los ataques de inyección SQL en el año 2011

PHP's urlencode() Devuelve una cadena en la que todos los caracteres no alfanuméricos excepto -_. han sido reemplazados con un signo de porcentaje (%) seguido de dos dígitos hexadecimales.

No me preocupan los espacios que se convierten en plus, u otros problemas de formato. Tampoco me preocupan los XSS y otros hacks HTML.

Creo que debería estar a salvo de ataques de estilo 'y'.

PREGUNTA: ¿Hay otros tipos de ataques sql que podrían usarse con - o _ o. ?

Ejemplo:

mysql_query("UPDATE cars SET color = '".urlencode($c)."' WHERE garage = 29"); 

Gracias de antemano

+8

¿Qué hay de malo con el uso de 'mysql_real_escape_string'? – deceze

+0

en el año 2011, debe abandonar la función mysql_ *, comenzar a utilizar la función mysqli_ *, o PDO – ajreal

+0

mysqli es una pesadilla dolorosa en comparación con PDO – Stephen

Respuesta

2

No creo que urlencode solo será suficiente para detener la inyección de SQL. Deberá usar atleast mysql_real_escape_string o prepared statements from PDO..

0

Utilice PDO y consultas paramaterizadas.

9

urlencode() tiene nada que ver con SQL, por lo que hace tanto para evitar la inyección SQL como lo hace el queroseno para hacer que sus hamburguesas sean más deliciosas. Además, todo lo que ingrese a su base de datos terminará codificado por URL, que luego deberá decodificar si desea hacer algo útil con ellos luego de recuperar la base de datos.

Escapar de sus consultas, por otro lado, ayuda a su aplicación a evitar la inyección SQL, y nada más. No modifica los datos que ingresa en sus consultas; solo protege sus consultas contra manipulaciones. Esa es la idea de la inyección SQL, y también es la razón por la cual la codificación URL de sus datos no hace nada para protegerse de ella. Otorgado, hace convierte tus apóstrofes ' en %27, haciéndolos inofensivos, pero como se menciona en el párrafo anterior, tendrás que decodificarlos URL de nuevo en apóstrofes para poder usarlos.

Utilice la herramienta adecuada para el propósito correcto. Especialmente en el año 2011, debe utilizar declaraciones preparadas en lugar de escanear manualmente las variables de consulta y concatenar cadenas para crear consultas.

+1

de esta manera: el kerosene hace que tus hamburguesas sean más deliciosas. :) – diEcho

+2

Entiendo que para la mayoría de las personas desearía que se transmitiera esa información. Pero mi pregunta fue más simple. La pregunta es. si el único alfa no existente es. _ y -, ¿cómo pueden inyectarse sentencias sql con el simple ejemplo de código anterior? ¿Conoce algún ataque que use solo esos caracteres y alfa? Como he dicho, no me preocupa el formateo, de hecho, se adapta a mis propósitos tener el formato urlencoded a medida que los paso por las páginas web. – Chris

+0

@Chris: si desea que la URL los codifique para que la use su aplicación, está bien, pero no confíe en ello para proteger sus consultas de la inyección. Como dice mi último párrafo, use la herramienta correcta para el trabajo correcto. Debería utilizar la función dedicada 'mysql_real_escape_string()' o usar declaraciones preparadas para protegerse realmente contra los ataques de inyección SQL. – BoltClock

8

No. En realidad, es peligroso usar la codificación de URL para la protección de inyección SQL.

  1. La codificación de URL es la codificación porcentual. Y % de caracteres en SQL tienen un significado especial en muchas bases de datos. Ejemplo: cláusulas LIKE. Permitir% chars en SQL dinámico aún generará problemas.
  2. Existe el riesgo de que los servidores intermedios (web) puedan decodificar automáticamente. Apache podría hacer esto.
+1

la primera y hasta ahora única respuesta que realmente nos dice qué puede salir mal. – cweiske

Cuestiones relacionadas