Foros del Web » Programando para Internet » PHP »

Hacer login con CURL

Estas en el tema de Hacer login con CURL en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 10/01/2010, 15:40
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 12 años, 10 meses
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[email protected]mysql_connect($sql_host,$sql_usuario,$sql_pass) or die(Redirigir_error(0) );
  47.        
  48.         $usuario_consulta[email protected]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[email protected]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!
  #2 (permalink)  
Antiguo 10/01/2010, 15:53
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 11 años, 9 meses
Puntos: 2534
Respuesta: Hacer login con CURL

NOTA que las sesiones por lo general utilizan cookies, tal ves eso si te se escapó... ;)
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 10/01/2010, 15:58
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 10 años, 7 meses
Puntos: 1517
Respuesta: Hacer login con CURL

Tienes que enviar la petición a la página que corrobora el username y password, no a la página donde tiene los campos para loguearse.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #4 (permalink)  
Antiguo 10/01/2010, 16:06
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 12 años, 10 meses
Puntos: 20
Respuesta: Hacer login con CURL

Cita:
Iniciado por abimaelrc Ver Mensaje
Tienes que enviar la petición a la página que corrobora el username y password, no a la página donde tiene los campos para loguearse.
Ostras es verdad, fallo mio.

He cambiado la dirección
$url = "http://panelme.com/includes/login.php";

Ahora me lleva a la página de error "ruta_incorrecta.php".
Revisando las dos zonas del script que redirige hacia esta página, he comprobado que la parte que está redirigiendo es esta de aquí, cuando se llama directo al script.

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.     }

Tiene algo que ver las sesiones/cookies que decía pateketrueke para conseguir que muestre la página?

Teoricamente si los datos son buenos me debería mostrar la pagina index.php
Header("location: /index.php");

¿Alguna manera de saltar esa protección con CURL?

Muchas gracias de antemano
  #5 (permalink)  
Antiguo 10/01/2010, 22:05
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 10 años, 7 meses
Puntos: 1517
Respuesta: Hacer login con CURL

Comenta esa parte del if y nos dejas saber como te va.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #6 (permalink)  
Antiguo 11/01/2010, 00:59
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 12 años, 10 meses
Puntos: 20
Respuesta: Hacer login con CURL

Cita:
Iniciado por abimaelrc Ver Mensaje
Comenta esa parte del if y nos dejas saber como te va.
Comentando esa parte, el script sigue adelante hasta la linea 94

Header("location: /index.php");

El problema ahora es que debería guardar los valores de la sesión tal y como muestra el script lineas antes de hacer la redirección al index.php

Código PHP:
Ver original
  1. // le damos un mobre a la sesion.
  2.                 session_name($usuarios_sesion);
  3.                 // incia sessiones
  4.                 session_start();
  5.                 // Paranoia: decimos al navegador que no "cachee" esta página.
  6.                 session_cache_limiter('nocache,private');
  7.                 // Asignamos variables de sesión con datos del Usuario para el uso en el
  8.                 // resto de páginas autentificadas
  9.                 // definimos variables de sesion.
  10.                 $_SESSION['usuario_id']=$usuario_datos['id'];
  11.                 $_SESSION['usuario_login']=$usuario_datos['usuario'];
  12.                 $_SESSION['usuario_password']=$usuario_datos['pass'];
  13.                 $_SESSION['usuario_ip']=$ip;
  14.                 $_SESSION['nivel_acceso']=$usuario_datos['nivel_acceso'];

Porque en todas las paginas del panel compruebo si el usuario inició sesión con esta simple linea
if (isset($_SESSION['usuario_login'])) {

He probado poniendo el session_start(); en el script de CURL pero me sigue rediregiendo a la pagina de usuario y contraseña, entiendo que es por que no almacena los datos de sesión o no los interpreta.

Gracias de antemano
  #7 (permalink)  
Antiguo 12/01/2010, 13:47
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 10 años, 7 meses
Puntos: 1517
Respuesta: Hacer login con CURL

Después de varias pruebas, de la única forma que pude lograr ver los cookies en otra página es usando dos consultas de curl. Cree dos páginas de PHP, de esta forma:
Código PHP:
Ver original
  1. <?php
  2. //b.php
  3. $_SESSION["username"] = "username";
  4. $_SESSION["password"] = "password";
Código PHP:
Ver original
  1. <?php
  2. //c.php
  3. echo $_SESSION["username"]."<br />";
  4. echo $_SESSION["password"];
Y el código que use para pasar un cookie a la otra página
Código PHP:
Ver original
  1. <?php
  2. //index.php
  3. $ch = curl_init('http://localhost/b.php');
  4. curl_setopt($ch,    CURLOPT_AUTOREFERER,        true);
  5. curl_setopt($ch,    CURLOPT_COOKIESESSION,      true);
  6. curl_setopt($ch,    CURLOPT_FAILONERROR,        false);
  7. curl_setopt($ch,    CURLOPT_FOLLOWLOCATION,     false);
  8. curl_setopt($ch,    CURLOPT_HEADER,             true);
  9. curl_setopt($ch,    CURLOPT_RETURNTRANSFER,     true);
  10. $result = curl_exec($ch);
  11.  
  12. $pattern = "/Set-Cookie: (PHPSESSID=.*?;)/i";
  13. preg_match_all($pattern, $result, $m);
  14.  
  15. $ch = curl_init('http://localhost/c.php');
  16. curl_setopt($ch,    CURLOPT_COOKIE,             $m[0][0]);
  17. curl_setopt($ch,    CURLOPT_AUTOREFERER,        true);
  18. curl_setopt($ch,    CURLOPT_COOKIESESSION,      true);
  19. curl_setopt($ch,    CURLOPT_FAILONERROR,        false);
  20. curl_setopt($ch,    CURLOPT_FOLLOWLOCATION,     false);
  21. curl_setopt($ch,    CURLOPT_HEADER,             false);
  22. curl_setopt($ch,    CURLOPT_RETURNTRANSFER,     true);
  23. $result = curl_exec($ch);
  24. echo $result;
La forma como lo logre, es usando el header de la página. Esta información la encontre en esta página http://www.phpbuilder.com/board/show...php?t=10346748
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #8 (permalink)  
Antiguo 12/01/2010, 14:13
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 12 años, 10 meses
Puntos: 20
Respuesta: Hacer login con CURL

Muchas gracias por tu tiempo

Intenté la prueba contra la web que tenia el script de login nuevamente, y si bien es cierto que consigue coger el ID de la sesión puede coger tb las sesiones que crea el script de login??

Código PHP:
Ver original
  1. $_SESSION['usuario_id']=$usuario_datos['id'];
  2. $_SESSION['usuario_login']=$usuario_datos['usuario'];
  3. $_SESSION['usuario_password']=$usuario_datos['pass'];
  4. $_SESSION['usuario_ip']=$ip;
  5. $_SESSION['nivel_acceso']=$usuario_datos['nivel_acceso'];

Probé con
$pattern = "/.usuario_id.*?/i";
sin éxito, no me pilla nada


Código PHP:
Ver original
  1. $postvalue['user'] = 'test';
  2. $postvalue['password'] = '123456';
  3. $postvalue['submit'] = 'Iniciar Sesión';
  4.  
  5. //pantalla de login
  6. $ch = curl_init('http://panelme.com/includes/login.php');
  7. curl_setopt($ch,    CURLOPT_AUTOREFERER,        true);
  8. curl_setopt($ch,    CURLOPT_COOKIESESSION,      true);
  9. curl_setopt($ch,    CURLOPT_FAILONERROR,        false);
  10. curl_setopt($ch,    CURLOPT_FOLLOWLOCATION,     false);
  11. curl_setopt($ch,    CURLOPT_HEADER,             true);
  12. curl_setopt($ch,    CURLOPT_RETURNTRANSFER,     true);
  13. curl_setopt($ch, CURLOPT_POSTFIELDS, $postvalue);
  14. $result = curl_exec($ch);
  15.  
  16. $pattern = "/Set-Cookie: (PHPSESSID=.*?;)/i";
  17. preg_match_all($pattern, $result, $m);
  18. print_r($m);
  19.  
  20. // Array ( [0] => Array ( [0] => PHPSESSID=fec4c66a7ad4f595063c6e6c0a2ce350; ) )
  21.  
  22. $ch = curl_init('http://http://panelme.com/index.php');
  23. curl_setopt($ch,    CURLOPT_COOKIE,             $m[0][0]);
  24. curl_setopt($ch,    CURLOPT_AUTOREFERER,        true);
  25. curl_setopt($ch,    CURLOPT_COOKIESESSION,      true);
  26. curl_setopt($ch,    CURLOPT_FAILONERROR,        false);
  27. curl_setopt($ch,    CURLOPT_FOLLOWLOCATION,     false);
  28. curl_setopt($ch,    CURLOPT_HEADER,             false);
  29. curl_setopt($ch,    CURLOPT_RETURNTRANSFER,     true);
  30. $result = curl_exec($ch);
  31.  
  32.  
  33. echo "<pre>";
  34. print_r($result); // vacio
  35. echo "</pre>";

Gracias nuevamente
  #9 (permalink)  
Antiguo 12/01/2010, 14:24
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 10 años, 7 meses
Puntos: 1517
Respuesta: Hacer login con CURL

Tu tienes que enviar esa información del username y password usando el método de POST en tu cURL, fíjate el aporte que indicaste para que veas como enviar usando ese método. Luego que lo hagas vas a ver que si podras visitar la segunda pagina con exito. Acuerdate que el servidor sabe que usuario está visitando la pagina por el PHPSESSID. Cuando le brindes la información del PHPSESSID vas a ver que funcionará las sesiones.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #10 (permalink)  
Antiguo 12/01/2010, 15:36
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 12 años, 10 meses
Puntos: 20
Respuesta: Hacer login con CURL

Cita:
Iniciado por abimaelrc Ver Mensaje
Tu tienes que enviar esa información del username y password usando el método de POST en tu cURL, fíjate el aporte que indicaste para que veas como enviar usando ese método. Luego que lo hagas vas a ver que si podras visitar la segunda pagina con exito. Acuerdate que el servidor sabe que usuario está visitando la pagina por el PHPSESSID. Cuando le brindes la información del PHPSESSID vas a ver que funcionará las sesiones.
abimaelrc por mas que miro lo hacen con la linea
curl_setopt($ch, CURLOPT_POSTFIELDS, $postvalue);

La misma que puse yo en el post anterior linea 13 no?? no veo de que otra forma lo envian (curl_setopt($ch, CURLOPT_POSTFIELDS, $loginFields); ) es lo mismo que hago yo :S

Me estoy equivocando en algo?

Gracias!

Etiquetas: curl, login
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 04:29.