• Publicidad

Crear un cookie al verificar un usuario correcto (PHP)

Todo lo relacionado con lenguajes de programación distintos de Perl: PHP, Java, C++, Ruby, Python, etc.

Crear un cookie al verificar un usuario correcto (PHP)

Notapor BigBear » 2010-03-24 13:24 @600

Hola.

Estoy haciendo un login en PHP. Éste utiliza un formulario para pedir usuario y password, si es correcto con la base de datos MySQL, éste debería crear una cookie con un valor llamado admin.

Acá el código del formulario:

Sintáxis: [ Descargar ] [ Ocultar ]
Using php Syntax Highlighting
  1. <title>LOGIN PASS</title>
  2. <h1> Bienvenido idiota logeate o cagate</h1>
  3. <h1>INSERTA USER Y PASSWORD</h1>
  4.  
  5.    
  6.       <form action="" method="post">
  7.  
  8.       Usuario:<input type="text" name="usuario" size="20" maxlength="20" />
  9.  
  10.       <br />
  11.  
  12.       Password:<input type="password" name="password" size="10" maxlength="10" />
  13.    
  14.       <br />
  15.    
  16.       <input type="submit" value="Ingresar" />
  17.  
  18.       </form>
  19.  
  20. <?php
  21.  
  22.       mysql_connect('localhost','root','123')or die ('Ha fallado la conexi&oacute;n: '.mysql_error());
  23.  
  24.       mysql_select_db('test')or die ('Error al seleccionar la Base de Datos: '.mysql_error());
  25.  
  26.       function quitar($mensaje)
  27.  
  28.       {
  29.           $nopermitidos = array("'",'\\','<','>',"\"");
  30.       $mensaje = str_replace($nopermitidos, "", $mensaje);
  31.     return $mensaje;
  32.  
  33.       }
  34.  if(trim($HTTP_POST_VARS["usuario"]) != "" && trim($HTTP_POST_VARS["password"]) != "")
  35.       {
  36.           $usuario = strtolower(htmlentities($HTTP_POST_VARS["usuario"], ENT_QUOTES));
  37.       $password = $HTTP_POST_VARS["password"];
  38.  
  39.                    $result = mysql_query("SELECT name,password FROM users WHERE name='$usuario'
  40.  
  41. AND password='$password' ");
  42.  
  43.           if($row = mysql_fetch_array($result)){
  44.          
  45.  
  46.               if($row["password"] == $password){
  47.                   $_SESSION["k_username"] = $row['usuario'];
  48.                  
  49.                   echo 'Has sido logueado correctamente '.$_SESSION['k_username'].' <p>';
  50.               }else{
  51.                  echo 'Password incorrecto';
  52.               }
  53.       }else{
  54.              echo 'Usuario no existente en la base de datos';
  55.           }
  56.           mysql_free_result($result);
  57.       }else{
  58.           echo 'Debe especificar un usuario y password';
  59.  
  60.       }
  61.       mysql_close();
  62. ?>
  63.  
Coloreado en 0.021 segundos, usando GeSHi 1.0.8.4


¿Alguien me podría explicar cómo creo la cookie cuando el logeo es exitoso?
Última edición por explorer el 2010-03-24 13:29 @604, editado 1 vez en total
Razón: Ortografía, tildes
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Crear un cookie al verificar un usuario correcto (PHP)

Notapor explorer » 2010-03-24 13:34 @607

No sé la respuesta, pero veo que el código es vulnerable a una inyección de SQL. Ten mucho cuidado.

Más información en Bobby Tables.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Crear un cookie al verificar un usuario correcto (PHP)

Notapor erv-Z » 2010-03-27 12:35 @566

Bueno, no me había dado cuenta que habías creado este post, de todo modos te doy la respuesta a tu problemita xD.

Primero que nada, no sé si sabes lo que estás haciendo, porque hablas de cookies y veo que utilizas sesiones, la diferencia de las cookies y las sesiones son que las sesiones se guardan en el servidor y las cookies la guarda el cliente.

Para generar una cookies necesitas usar la función setcookie()

Los parámetros son simples...
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
setcookie(nombre, valor, tiempo, ....)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Para que funcione, reemplazarías la línea 47 por esta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using php Syntax Highlighting
  1. setcookie("k_username",$row['usuario']);
Coloreado en 0.009 segundos, usando GeSHi 1.0.8.4


Te creara una cookie llamada k_username, con el valor de $row['usuario'].


Otra cosa, no uses la función trim, que solo borrará los espacio que existen al principio y al final, lo recomendable es usar la función mysql_real_escape_string y también te protege contra inyecciones SQL...

Saludos.
Última edición por explorer el 2010-03-27 14:43 @655, editado 1 vez en total
Razón: Tildes
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Re: Crear un cookie al verificar un usuario correcto (PHP)

Notapor BigBear » 2010-03-27 14:29 @645

Ok, gracias, como verás en PHP estoy dead. Ese código no es mío; lo saqué de un manual que vi en Internet; por eso no se nada de sesiones ni lo que hace el código, pero con el tiempo mejoraré xD


P.D.: PHP es más difícil que Perl.
Última edición por explorer el 2010-03-27 14:45 @656, editado 1 vez en total
Razón: Tildes
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Crear un cookie al verificar un usuario correcto (PHP)

Notapor explorer » 2010-03-27 15:08 @672

erv-Z escribiste:Primero que nada, no sé si sabes lo que estás haciendo, porque hablas de cookies y veo que utilizas sesiones, la diferencia de las cookies y las sesiones son que las sesiones se guardan en el servidor y las cookies la guarda el cliente.

Perdona, pero esto no es (del todo) correcto.

* Sesión es una técnica por la cual controlamos la interacción de un sistema con un usuario, a lo largo de un tiempo.

* Una galleta (cookie) es un fichero que se guarda en el lado del cliente, por parte de los navegadores web, y por orden del servidor web.

Pero:

* Se puede controlar una sesión de usuario guardando toda la información en el lado del cliente, bien sea con galletas o guardándola de forma oculta en la página HTML, pero el uso de galletas no es obligatoria. Ni tampoco es obligatorio dejar la información de usuario en un lado u otro.

* Una galleta puede guardar cualquier información, no solo sesiones.

Sí que puedes usar galletas para controlar las sesiones, pero no puedes relacionar galletas y sesiones de esa forma.

Es como decir que para que un dentista me cure las muelas, tengo que ir en coche. Sí que puedo ir en coche, pero no es obligatorio. De hecho, no tiene nada que ver mi dentista con mi coche.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Crear un cookie al verificar un usuario correcto (PHP)

Notapor erv-Z » 2010-03-27 15:43 @696

erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Re: Crear un cookie al verificar un usuario correcto (PHP)

Notapor kidd » 2010-03-27 17:45 @781

erv-Z escribiste:http://www.webtaller.com/construccion/lenguajes/php/lessons/sesiones.php


Lo siento, pero la definición de lo que son sesiones en ese artículo también es incorrecta.

Básicamente una sesión es una técnica por medio de la cual mantienes una comunicación entre dos o más partes, independientemente de cómo decidas llevar a cabo eso.

Como el protocolo HTTP es en fundamento stateless, se acostumbra a iniciar una sesión para mantener la comunicación activa entre el cliente-servidor a través de los diferentes requests que se lleven a cabo.

Como indica Joaquín, no hay que confundir los términos.
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Re: Crear un cookie al verificar un usuario correcto (PHP)

Notapor erv-Z » 2010-03-27 18:38 @818

Bueno, a ver... no sé en qué me equivoqué o por qué me corrigen...

Las sesiones no se pueden manipular, se almacenan en el servidor y por lo tanto no puedes mirar, modificar, eliminar... Lo único que puedes hacer es llamar la sesión...

Sintáxis: [ Descargar ] [ Ocultar ]
Using php Syntax Highlighting
  1. <?php
  2. session_start();
  3. echo session_save_path();
  4. ?>
Coloreado en 0.015 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$ php /var/www/a.php
/var/lib/php5
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


* Se puede controlar una sesión de usuario guardando toda la información en el lado del cliente, bien sea con galletas o guardándola de forma oculta en la página HTML, pero el uso de galletas no es obligatoria. Ni tampoco es obligatorio dejar la información de usuario en un lado u otro.

¿Cómo vas a controlar una sesión de un usuario guardando su información en el lado del cliente, si las sesiones no funcionan así? El cliente manda el nombre de la sesión y si existe dicha sesión el servidor le devuelve la información... La sesión se puede pedir ya sea vía GET o vía POST. Ej.:
Sintáxis: [ Descargar ] [ Ocultar ]
Using php Syntax Highlighting
  1. <?php
  2. session_start();
  3. $var = 'Ejemplo';
  4. $_SESSION['ej'] = $var;
  5. if(!empty($_SESSION['ej'])){
  6. echo "La sesión es: ".$_SESSION['ej'];
  7. exit;
  8. }else{
  9. echo "No existe la sesión";
  10. exit;
  11. }
  12. ?>
Coloreado en 0.013 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Hacemos una petición POST
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.2.2pre) Gecko/20100308 Ubuntu/9.10 (karmic) Namoroka/3.6.2pre
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cookie: PHPSESSID=e85d1da778b6c8fc4db1a83e2bb55385
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

El script responde:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
La sesión es: Ejemplo
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Y miramos si existe el nombre de la sesión en el servidor.
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
# ls |grep e85d1da778b6c8fc4db1a83e2bb55385
sess_e85d1da778b6c8fc4db1a83e2bb55385
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Y vemos que sí existe.
También si hacemos una petición GET.
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
http://127.0.0.1/a.php?PHPSESSID=0e30e0dcd16d068ed80f95767e56cef8
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
La sesión es: Ejemplo
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Sí que puedes usar galletas para controlar las sesiones, pero no puedes relacionar galletas y sesiones de esa forma.

Las cookies no controlan nada, solo se usa para llamar la sesiones, también se puede llamar vía GET como lo hice anteriormente, el nombre de la sesión por defecto es PHPSESSID y se puede cambiar desde el php.ini
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$ cat /etc/php5/apache2/php.ini |grep session.name
session.name = PHPSESSID
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


En fin, las sesiones se guardan en el servidor y no la puede controlar el cliente, lo que hace el cliente es llamarla sea vía GET o POST, y si existe el servidor le manda la información que contiene dicha sesión.

Saludos.

sesiones php
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Re: Crear un cookie al verificar un usuario correcto (PHP)

Notapor explorer » 2010-03-27 19:35 @858

No nos hemos entendido :)

kidd y yo hablamos de sesiones como un proceso, no de Sessions, una librería de PHP.

Y sí que se puede llevar el control de sesión (en minúscula) en el lado del cliente. No es normal hacerlo hoy en día, por el tema de la seguridad, pero es perfectamente válido.

En el mismo enlace a Session (computer science) que te he puesto antes, hay un apartado que habla de esa técnica, en la sección Client side web sessions. Básicamente, consiste en que en el cliente, normalmente a través de una galleta u oculto en la propia página HTML, se guarda todo el estado de la sesión de ese usuario. Cuando el usuario activa la acción de un formulario, la galleta o el contenido oculto del formulario viajan con la petición POST. El servidor obtiene todos los datos referentes a quién y qué estaba haciendo. Por ello no le es necesario almacenar nada en el lado del servidor.

En el caso que nos ocupa, este hilo, debe quedar claro que cuando estáis hablando de sesiones, en realidad estáis hablando de sesiones gestionadas por la librería Sessions de PHP.

Perdón por la confusión.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Programación en general

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 12 invitados