elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  Seguridad en ajax
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Seguridad en ajax  (Leído 9,818 veces)
Gorky


Desconectado Desconectado

Mensajes: 770



Ver Perfil WWW
Seguridad en ajax
« en: 4 Enero 2012, 13:32 pm »

Hola foreros:

Quisiera saber como solucionar el siguiente problema de seguridad.
Estoy realizando una aplicación que va haciendo llamadas desde ajax y me gustaría saber como evitar que los archivos php se puedan ejecutar directamente sin pasar por el flujo normal de la aplicación.
En el caso de que fuesen llamadas normales a archivos php se que se puede hacer declarando una variable en el archivo padre y comprobando si esta definida en el hijo pero si hago eso me encuentro con que nunca esta declarada ( y es lógico que no lo esté ).
¿Se os ocurre alguna solución para mi problema? Muchas gracias.


En línea

#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.850



Ver Perfil WWW
Re: Seguridad en ajax
« Respuesta #1 en: 4 Enero 2012, 13:50 pm »

2 soluciones.

1. Con un .htaccess para restringir la ejecución de archivos .PHP o ciertos archivos.

Para restringir los archivos PHP (que no puedan ser ejecutados), debes crear un .htaccess en la carpeta donde están alojados y introducir lo siguiente:
Código
  1. <FilesMatch "\.(php)$">
  2. Order Allow,Deny
  3. Deny from all
  4. </FilesMatch>

Si lo que quieres es restringir un determinado archivo, haz el mismo procedimiento de antes, solo que introduciendo lo siguiente:
Código
  1. <files nombre.php>
  2. order allow,deny
  3. deny from all
  4. </files>

2. Usar un token.
Me explico, un token es un numero (normalmente cifrado en md5) aleatorio, que se suele guardar en una cookie o en sessiones.

Este "token" permite comprobar si se ha pasado antes por un procedimiento, o la función/archivo ha sido solicitado directamente.

El código que generaría el token puede ser este:

Código
  1. <?php
  2. function generar_token(){
  3.   $token = md5(mt_rand(11,99999));
  4.   $_SESSION['token']=$token;
  5.   return $token;
  6. }
  7.  

Puedes incluirlo o solicitarlo al principio de la pagina y luego llamarlo cada vez que necesites ejecutar una función para que lo compruebe.

El código para que lo compruebe seria este:

Código
  1. <?php
  2. function comprobar_token($token){
  3.    @session_start();
  4.    if($_SESSION['token']===$token){return true;}else{return false;}
  5. }
  6. ?>
  7.  

Si necesitas mas ayuda o explicación solo comenta   :)

Saludos


En línea

Gorky


Desconectado Desconectado

Mensajes: 770



Ver Perfil WWW
Re: Seguridad en ajax
« Respuesta #2 en: 4 Enero 2012, 18:48 pm »

Muchas gracias por responder drvy | BSM
Me parece mejor opción la segunda pero tengo alguna laguna.
De la forma que lo he entendido, seguiría teniendo el mismo problema ya que al pasar por la función que escribe la variable de sesión (que suponemos que estaría en el archivo padre) ya tenemos la puerta abierta a ejecutar el resto de archivos php.
O dicho de otra forma. Si ejecutamos los archivos hijo al principio nos reconocería que no hemos pasado por el padre pero si ejecutamos el padre y acto seguido el hijo lo ejecutaría sin problema.
Corrígeme si me equivoco por favor.
En línea

#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.850



Ver Perfil WWW
Re: Seguridad en ajax
« Respuesta #3 en: 5 Enero 2012, 17:10 pm »

Pues no te entendí pero creo que te entendí  :rolleyes:

Según lo que he entendido, crees que seria lo mismo porque las 2 se llamarían desde el mismo archivo.

No. La función para comprobarlo estará en el archivo padre, pero la de generarlo estará en el que solicita la acción. Y cada vez que necesites hacer una acción tendras que mandar el token también. Asi te evitas el mal uso.

Te explico.

Tenemos 2 archivos.

Digamos que jbb.php es el que procesa la informacion que envias mediante ajax desde ajax.php por ejemplo.

en jbb.php al principio tendrias algo asi:

Código
  1. if(!comprobar_token($_POST['token'])){
  2. die('El token no es valido, utilice nuestra web y no acceda diractamente.');
  3. }

Esto me imagino, que sabes, que lo que hace seria llamar la función comprobar_token con el POST 'token',

Bueno y imaginemos que el  ajax.php tendra algo asi al principio.

Código
  1. <?php
  2. $token = generar_token();
  3. ?>
  4.  

Entonces, tu cada vez que envíes algo por ajax hacia jbb.php, tendrás que incluir la variable $token como parámetro(post).

Ejemplo total:

Archivo jbb.php (el que procesa)
Código
  1. <?php
  2. function comprobar_token($token){
  3. // Comprobar si la session esta inicida.
  4. if(!isset($_SESSION['token'])){
  5. return false;
  6. }
  7. // Comprobar si es el mismo que tenemos
  8. // nosotros guardado.
  9. if($token==$_SESSION['token']){
  10. // si es valido devolver true;
  11. return true;
  12. } else {
  13. // si no es valido, devolver false
  14. return false;
  15. }
  16. }
  17.  
  18. // Si comprobar_token(..) devuelve false, morir.
  19. if(!comprobar_token(@$_POST['token'])){
  20. die('El token no es valido, utilice nuestra web y no acceda diractamente.');
  21. }
  22.  
  23. // Tu codigo
  24. // ejemplo:
  25. echo 'Holaaaa usuario: '.$_POST['nombre'];
  26. ?>
  27.  

Archivo ajax.php (el que pide)
Código
  1. <?php
  2. function generar_token(){
  3. @session_start();
  4. $token = md5(mt_rand(11,99999));
  5. $_SESSION['token'] = $token;
  6. return $token;
  7. }
  8. $token = generar_token();
  9. ?>
  10.  
  11. <title>alalal</title>
  12. <!-- Yo utilizare jquery porque es mas facil xD -->
  13. <script src="http://code.jquery.com/jquery-1.7.1.min.js" ></script>
  14.  
  15. <!-- Llamar jbb.php con parametros -->
  16. $(document).ready(function() {
  17. $("#formulario").submit(function(e){
  18. e.preventDefault();
  19. $.post("jbb.php", $("#formulario").serialize(),function(data) {
  20.   alert(data)});
  21. });
  22. });
  23. </script>
  24. </head>
  25. <div>
  26. <form id="formulario" action="jbb.php" method="POST">
  27. <label>Nombre:</label>
  28. <input type="text" name="nombre"/>
  29. <!-- Importante, meter el token como campo oculto -->
  30. <input type="hidden" name="token" value="<?php echo $token; ?>" />
  31. <input type="submit" nombre="enviar" value="Comprobar" />
  32. </form>
  33. </div>
  34. </body>
  35. </html>
  36.  

Asi, si llamamos directamente al archivo jbb.php te devolverá esto:
Código:
El token no es valido, utilice nuestra web y no acceda directamente.

Y si lo llamas sin el campo token también xD



Saludos
« Última modificación: 5 Enero 2012, 17:13 pm por drvy | BSM » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ajax Y php
PHP
David Vans 2 2,138 Último mensaje 22 Septiembre 2007, 20:42 pm
por дٳŦ٭
Aprendiendo AJAX con PHP!!
PHP
Diabliyo 4 2,478 Último mensaje 26 Julio 2008, 04:22 am
por Diabliyo
[Tutorial] - Login con ajax . Mysql || Php con clases || Ajax « 1 2 »
PHP
Hadess_inf 15 26,396 Último mensaje 9 Diciembre 2010, 02:44 am
por delorian15
Ayuda para mejorar la seguridad con Ajax
Seguridad
Zinico 1 2,800 Último mensaje 24 Noviembre 2012, 14:57 pm
por ‭lipman
Colocar seguridad a un script php desde Ajax
Desarrollo Web
yoelrodguez 2 2,240 Último mensaje 23 Agosto 2021, 01:26 am
por #!drvy
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines