Ver Mensaje Individual
  #8 (permalink)  
Antiguo 15/06/2011, 04:06
Avatar de cristian_cena
cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 10 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