Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

¿Como evitar caracteres especiales en una url para evitar inyección sql?

Estas en el tema de ¿Como evitar caracteres especiales en una url para evitar inyección sql? en el foro de Mysql en Foros del Web. Hola compañeros. He estado probando un sitio autoadministrable por panel que he desarrollado usando mysql y php. Y he notado que es vulnerable. Pude autohacerme ...
  #1 (permalink)  
Antiguo 21/04/2011, 23:39
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 9 meses
Puntos: 269
¿Como evitar caracteres especiales en una url para evitar inyección sql?

Hola compañeros.
He estado probando un sitio autoadministrable por panel que he desarrollado usando mysql y php. Y he notado que es vulnerable.
Pude autohacerme una inyección sql siguiendo este tutorial.
Necesitaría saber como puedo defenderme de este ataque de consultas vía url.

En la tabla de los administradores del panel tomo el campo del password del usuario administrador y lo pongo como md5.
¿es seguro el md5, representa una muralla para este tipo de ataques o se puede desencriptarlo?
La contraseña la escribo con minúsculas mayúsculas y números.

Al respecto:
Navegue tratando de encontrar paginas que desencripten md5 y encontré esta http://md5decryption.com/ pero me suena raro porque hice una primera prueba introduciendo el código md5 correspondiente a la cadena "admin" y lo desencriptó.
Pero luego introduje el código md5 correspondiente a una cadena ya usando mayúsculas, minúsculas y números y no lo desencriptó. No se si es una truchada o si desencripta md5 realmente.

Resumiendo. Tengo dos dudas.
1 - ¿como evitar que trabajen con caracteres especiales en la url (y tambien evitarlo vía post) y que con ello puedan consultar mi base de datos?
2 - ¿Es seguro md5? ¿o debo usar SHA1? ¿o ningúna encriptación sirve y de cualquier modo me la van a poder dar vuelta y entrar al panel?

Cualquier link, consejo o sugerencia es bienvenida.

Desde ya muchas gracias por su tiempo.

Última edición por cristian_cena; 22/04/2011 a las 00:16
  #2 (permalink)  
Antiguo 23/04/2011, 06:20
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: ¿Como evitar caracteres especiales en una url para evitar inyección sql?

md5 es un algoritmo que encripta contraseñas en un solo sentido y no hay una forma de conocer el password real.

esta pagina lo que tiene es una gran base de datos de palabras comunes como admin, hola, y palabras comunes que comparan los resultados del md5 contra su reslutado en md5. Por esta razón cuando pones una combinación con numeros y mayusculas esta pagina es un verdadero fraude.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 23/04/2011, 06:25
Avatar de VbOkonly  
Fecha de Ingreso: julio-2009
Ubicación: San Justo, Buenos Aires, Argentina
Mensajes: 490
Antigüedad: 14 años, 9 meses
Puntos: 5
Respuesta: ¿Como evitar caracteres especiales en una url para evitar inyección sql?

Mira un amigo me dijo que para evitar ciertos tipos de injecciones hay que hacer uniones entre las tablas para asi despues, el lammer no intenta hacer otras uniones ya que estan echas o algo asi, no entiendo mucho de esto de injecciones pero voy a empesar a leer.
PD: mi amigo administra una db mysql xD
__________________
Mi primera web: http://www.mascoteame.com
  #4 (permalink)  
Antiguo 23/04/2011, 06:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: ¿Como evitar caracteres especiales en una url para evitar inyección sql?

Hay muchas formas de gestionar el problema, pero dos son las más simples, y que debes manejar desdeel principio: Programáticamente (en la aplicación) y en la base por stored procedures.
1) Programáticamente, todos los lenguajes que operan en web, como el PHP, tienen funciones y recursos para gestionar precisamente eso: el sql-injection. Aprovéchalos.
2) A nivel de base de datos, uno de los medios más seguros es usar stored procedures, ya que como lo único que peuden recibir son parámetros, es decir valores reales, cualquier otra cosa que se quiera meter en ellos genera un error de ejecución.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 26/04/2011, 13:03
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 9 meses
Puntos: 269
Respuesta: ¿Como evitar caracteres especiales en una url para evitar inyección sql?

Hola huesos: gracias por la info, me deja más tranquilo.

Hola VbOkonly: no entendí como hacer lo que indicas

Hola gnzsoloyo:

1 "programáticamente: Tal vez hables de mysql_real_escape_string()? que otras? alguna buena práctica o link que puedas sugerirme?

2 "procedimientos almacenados": quedó claro.

--------------------------------------------------
Gracias a todos por su tiempo, saludos.
  #6 (permalink)  
Antiguo 26/04/2011, 13:10
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: ¿Como evitar caracteres especiales en una url para evitar inyección sql?

La expresión "programáticamente" significa que se resuelve en la codificación de la aplicación, según el lenguaje que se use para programar.
En mi caso, lo que más uso son los manuales de los lenguajes, no tutoriales, ya que no sólo tienes la documentación precisa sino que siempre hay ejemplos básicos. El resto es práctica.

En el extremo del caso, uso www.codeproject.com.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 26/04/2011, 13:17
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 9 meses
Puntos: 269
Respuesta: ¿Como evitar caracteres especiales en una url para evitar inyección sql?

Entendi el significado que dabas a dicha expresión, en mi caso uso php, ya veré que funciones puedo usar. gracias de todos modos. un abrazo.
  #8 (permalink)  
Antiguo 15/06/2011, 04:06
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 9 meses
Puntos: 269
Respuesta: ¿Como evitar caracteres especiales en una url para evitar inyección sql?

vuelvo, para compartir el modo en que efrenté el problema, ojalá me den su opinión al respecto:

Con este código evito que escriban un string en una variable que deseamos sea de tipo integer y esten relacionadas a un campo de una tabla, por ejemplo para las páginas del frontend cuya url sea del tipo: midominio.com?id=5 que suelen pasar consultas sobre esa id para llegar hasta la tabla de los administradores y hacerse con el nombre de usuario y contraseña

Código PHP:
Ver original
  1. if(isset($_GET['id']))
  2. {
  3.     if( !is_numeric($_GET['id']) )
  4.     {
  5.         echo "  <script type=\"text/javascript\">
  6.                alert('Usted intenta violar la seguridad de este sitio.');
  7.                </script>";
  8.         // por si desactivan javascript redireccionamos con un meta...
  9.         echo "<meta http-equiv='refresh' content='0;url=http://www.google.com'>";
  10.         return false;
  11.     }
  12. }


Luego para evitar que ingresen caracteres extraños en los formularios, por ejemplo en el formulario de logueo:

Código PHP:
Ver original
  1. // Modificamos las variables pasadas por URL
  2. foreach( $_GET as $variable => $valor ){
  3. $_GET [ $variable ] = str_replace ( "'" , "" , $_GET [ $variable ]);
  4. $_GET [ $variable ] = str_replace ( "\"" , "" , $_GET [ $variable ]);
  5. $_GET [ $variable ] = str_replace ( "=" , "" , $_GET [ $variable ]);
  6. $_GET [ $variable ] = str_replace ( "(" , "" , $_GET [ $variable ]);
  7. $_GET [ $variable ] = str_replace ( ")" , "" , $_GET [ $variable ]);
  8. $_GET [ $variable ] = str_replace ( ";" , "" , $_GET [ $variable ]);
  9. $_GET [ $variable ] = str_replace ( "." , "" , $_GET [ $variable ]);
  10. $_GET [ $variable ] = str_replace ( ":" , "" , $_GET [ $variable ]);
  11. $_GET [ $variable ] = str_replace ( "&", "" , $_GET [ $variable ]);
  12. $_GET [ $variable ] = str_replace ( "#", "" , $_GET [ $variable ]);
  13. $_GET [ $variable ] = str_replace ( "/", "" , $_GET [ $variable ]);
  14. $_GET [ $variable ] = str_replace ( "?", "" , $_GET [ $variable ]);
  15. }
  16. // Modificamos las variables de formularios
  17. foreach( $_POST as $variable => $valor ){
  18. $_POST [ $variable ] = str_replace ( "'", "" , $_POST [ $variable ]);
  19. $_POST [ $variable ] = str_replace ( "\"", "" , $_POST [ $variable ]);
  20. $_POST [ $variable ] = str_replace ( "=", "" , $_POST [ $variable ]);
  21. $_POST [ $variable ] = str_replace ( "(", "" , $_POST [ $variable ]);
  22. $_POST [ $variable ] = str_replace ( ")", "" , $_POST [ $variable ]);
  23. $_POST [ $variable ] = str_replace ( ";", "" , $_POST [ $variable ]);
  24. $_POST [ $variable ] = str_replace ( ".", "" , $_POST [ $variable ]);
  25. $_POST [ $variable ] = str_replace ( ":", "" , $_POST [ $variable ]);
  26. $_POST [ $variable ] = str_replace ( "&", "" , $_POST [ $variable ]);
  27. $_POST [ $variable ] = str_replace ( "#", "" , $_POST [ $variable ]);
  28. $_POST [ $variable ] = str_replace ( "/", "" , $_POST [ $variable ]);
  29. $_POST [ $variable ] = str_replace ( "?", "" , $_POST [ $variable ]);
  30. }

Finalmente, encripto en md5 el campo destinado al password de la tabla de administradores. y uso una cadena de más de 10 dígitos que incluye minúsculas, mayúsculas y números.

En las páginas internas del backend, en absolutamente todas valido la sesión del usuario logueado y en caso de retornar falso redirecciono.

¿que les parece? ¿encuentran algún hueco para mejorar?

Saludos.

Última edición por cristian_cena; 15/06/2011 a las 04:16
  #9 (permalink)  
Antiguo 09/07/2011, 00:47
 
Fecha de Ingreso: junio-2008
Mensajes: 175
Antigüedad: 15 años, 9 meses
Puntos: 11
Respuesta: ¿Como evitar caracteres especiales en una url para evitar inyección sql?

grandioso aporte christian_cena, me viene genial para incluirlo en una funcion y sanear mis variables cada vez que tenga que pasarlas a otra pagina :D
  #10 (permalink)  
Antiguo 09/07/2011, 03:48
Avatar de Uncontroled_Duck
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Málaga [Spain]
Mensajes: 806
Antigüedad: 12 años, 11 meses
Puntos: 261
Respuesta: ¿Como evitar caracteres especiales en una url para evitar inyección sql?

Utiliza PDO para las consultas. Tengo entendido que evita en gran medida el problema de las inyecciones.

Saludos,
__________________
Todos agradeceremos que pongas el código en su respectivo Highlight
  #11 (permalink)  
Antiguo 09/07/2011, 18:18
Avatar de iviamontes  
Fecha de Ingreso: enero-2011
Ubicación: $cubano->Arg->Mendoza
Mensajes: 1.184
Antigüedad: 13 años, 3 meses
Puntos: 209
Respuesta: ¿Como evitar caracteres especiales en una url para evitar inyección sql?

para sanear las consultas lo que uso es mysql_real_escape_string, si hago esto es necesario tmb poner todas las sustituciones de caracteres ????
__________________
aconcaguaestudio.com

Etiquetas: caracteres, especiales, inyección, sql, url
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:10.