Ver Mensaje Individual
  #1 (permalink)  
Antiguo 10/01/2010, 15:40
Avatar de neodani
neodani
 
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Hacer login con CURL

Buenas,

Después de leer el interesante aporte
http://www.forosdelweb.com/f18/aport...equest-724214/

Creo que lo estoy haciendo bien, pero la página con la que intento validar debe tener algo que me impide validarme con CURL directamente.

Lo mejor de todo es que lo estoy probando en local contra un panel interno que diseñé, por lo que puedo ver exactamente como se realiza la validación para entrar.

Script de curl

Código PHP:
Ver original
  1. <?php
  2. $postvalue['user'] = 'test';
  3. $postvalue['password'] = '123456';
  4. $postvalue['submit'] = 'Iniciar Sesión';
  5.  
  6. $url = "http://panelme.com/index.php"; // escribe aqui la url de tu formulario
  7. $ch = curl_init(); // Inicializo el handler de Curl
  8. //Seteo las opciones para el envio
  9. curl_setopt($ch, CURLOPT_URL,$url); // Url a donde se va a postea.
  10. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11'); //Seteo el user Agent en este caso es el navegador firefox 2
  11. curl_setopt($ch, CURLOPT_FAILONERROR, 1); //terminar en caso de error
  12. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);// Permitir Redirecciones
  13. curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // Retornar la pagina de resultados en una variable
  14. curl_setopt($ch, CURLOPT_TIMEOUT, 1); //timeout.
  15. curl_setopt($ch, CURLOPT_POST, 1); // SETEAR el Envio por POST
  16. curl_setopt($ch, CURLOPT_POSTFIELDS, $postvalue); //cargo los datos del formulario
  17. $result = curl_exec($ch); // Ejecutar el envio por post.
  18. curl_close($ch); // Cierro la consulta
  19.  
  20. echo "<pre>";
  21. echo $result;
  22. echo "</pre>";
  23. ?>

Cuando lo lanzo me muestra el codigo de la pagina de login y pass

Y este es el script que corre al otro lado para validar la entrada

Código PHP:
Ver original
  1. <?
  2. /*
  3. Autentificacion de usuarios
  4. Autor: neodani
  5.  
  6. */
  7. // Cargar datos conexion y otras variables.
  8. include ("config_BD.inc.php");
  9. include("getRealIP.inc.php");
  10. $ip=getRealIP();
  11. // chequear página que lo llama para devolver errores a dicha página.
  12. $url = explode("?",$_SERVER['HTTP_REFERER']);
  13. $pag_referida=$url[0];
  14. $redir=$pag_referida;
  15.  
  16. function Redirigir_error($num_error) {
  17.   $_SESSION['error']=$num_error;  
  18.   Header ("Location: /entrada_login.php");
  19.   exit;
  20. }
  21. // chequear si se llama directo al script.
  22. if ($_SERVER['HTTP_REFERER'] == ""){
  23.     die (Header ("Location: /error/ruta_incorrecta.php"));
  24.     exit;
  25.     }
  26.    
  27.  
  28. // Chequeamos si se está autentificandose un usuario por medio del formulario
  29. if (isset($_POST['user']) && isset($_POST['password'])) {
  30.     $user = trim($_POST['user']);
  31.     $pass = trim($_POST['password']);
  32.     // eliminamos barras invertidas y dobles en sencillas
  33.     $user = stripslashes($user);
  34.     // encriptamos el password en formato md5 irreversible.
  35.     $pass = md5($pass);
  36.    
  37.    
  38.     if(($user == '') or ($pass == '')){
  39.         header("Location:  $redir");
  40.         $_SESSION['error']=7;
  41.         exit;
  42.         }
  43.  
  44.     else{
  45.         $query="SELECT * FROM panelme_usuarios WHERE usuario='$user'";
  46.         $db_conexion=@mysql_connect($sql_host,$sql_usuario,$sql_pass) or die(Redirigir_error(0) );
  47.        
  48.         $usuario_consulta=@mysql_db_query($sql_db,$query,$db_conexion) or die(Redirigir_error(1) );
  49.        
  50.         if(mysql_num_rows($usuario_consulta)==0){ // El usuario NO EXISTE.
  51.             Header ("Location: $redir"); //si no existe el usuario error redirijimos error.
  52.             $_SESSION['error']=13;
  53.             $query2="SET time_zone = '+1:00'";
  54.             $usuario_consulta2=@mysql_db_query($sql_db,$query2,$db_conexion) or die(Redirigir_error(1) );
  55.             $query1="insert into panelme_accesos (fecha,ip,usuario,password,valido) VALUES (now(), '$ip', '$user', '$pass',1)";
  56.             @mysql_db_query($sql_db,$query1,$db_conexion) or die(Redirigir_error(1) );
  57.             exit;
  58.         }else
  59.             { //El usuario EXISTE.
  60.             $_SESSION['user']=$_POST['user'];
  61.             // almacenamos datos del Usuario en un array para empezar a chequear.
  62.             $usuario_datos = mysql_fetch_array($usuario_consulta);
  63.             // liberamos la memoria usada por la consulta, ya que tenemos estos datos en el Array.
  64.             mysql_free_result($usuario_consulta);
  65.            
  66.  
  67.             if($usuario_datos["password"]==$pass){
  68.                 /* Comprobamos que el password encriptado en la BD coincide con el password que nos han dado al encriptarlo. Recuerda usar la misma semilla para encriptar los dos passwords. */
  69.                 $query1="insert into panelme_accesos (fecha,ip,usuario,password,valido) VALUES (now(), '$ip', '$user', '$pass',0)";
  70.                 @mysql_db_query($sql_db,$query1,$db_conexion) or die(Redirigir_error(1) );
  71.                 // cerramos la Base de dtos.
  72.                 mysql_close($db_conexion);
  73.                 // Paranoia: destruimos las variables login y password usadas
  74.                 unset($login);
  75.                 unset ($password);
  76.                 // le damos un mobre a la sesion.
  77.                 session_name($usuarios_sesion);
  78.                 // incia sessiones
  79.                 session_start();
  80.                 // Paranoia: decimos al navegador que no "cachee" esta página.
  81.                 session_cache_limiter('nocache,private');
  82.                 // Asignamos variables de sesión con datos del Usuario para el uso en el
  83.                 // resto de páginas autentificadas
  84.                 // definimos variables de sesion.
  85.                 $_SESSION['usuario_id']=$usuario_datos['id'];
  86.                 $_SESSION['usuario_login']=$usuario_datos['usuario'];
  87.                 $_SESSION['usuario_password']=$usuario_datos['pass'];
  88.                 $_SESSION['usuario_ip']=$ip;
  89.                 $_SESSION['nivel_acceso']=$usuario_datos['nivel_acceso'];
  90.                 // Hacemos una llamada a si mismo (scritp) para que queden disponibles
  91.                 // las variables de session en el array asociado $HTTP_...
  92.                 $pag=$_SERVER['PHP_SELF'];
  93.                 Header("location: /index.php");
  94.             }else {
  95.                 Header ("Location: $redir"); //password incorrecto
  96.                 $_SESSION['error']=13;
  97.                 $query1="insert into panelme_accesos (fecha,ip,usuario,password,valido) VALUES (now(), '$ip', '$user', '$pass',1)";
  98.                 @mysql_db_query($sql_db,$query1,$db_conexion) or die(Redirigir_error(1) );
  99.                 // cerramos la Base de dtos.
  100.                 mysql_close($db_conexion);
  101.                 exit;
  102.                 }
  103.         }    
  104.     }
  105. }else {
  106. // -------- Chequear sesión existe -------
  107. // usamos la sesion de nombre definido.
  108. session_name($usuarios_sesion);
  109. // Iniciamos el uso de sesiones
  110.  
  111. // Chequeamos si estan creadas las variables de sesión de identificación del usuario,
  112. // El caso mas comun es el de una vez "matado" la sesion se intenta volver hacia atras
  113. // con el navegador.
  114.  
  115. if (!isset($_SESSION['usuario_login']) && !isset($_SESSION['usuario_password'])){
  116.     // Borramos la sesion creada por el inicio de session anterior
  117.     die (Header ("Location: /error/ruta_incorrecta.php"));
  118.     exit;
  119.     }
  120. }
  121. ?>

En un principio creía que lo que podía estar fastidiandome sería este trozo

Código PHP:
Ver original
  1. // chequear si se llama directo al script.
  2. if ($_SERVER['HTTP_REFERER'] == ""){
  3.     die (Header ("Location: /error/ruta_incorrecta.php"));
  4.     exit;
  5.     }

Pero al ver que cuando hago la ejecución del script en CURL no se descarga el código de la web de error, entiendo que esta validación la hace bien y no entra en ese if.

¿Veis algo que se me escape?

El formulario no envia ninguna variable hidden ni utiliza cookies.

Gracias de antemano!