Tutorial [PHP] Sistema de Login [Avanzado]

Estado
No está abierto para más respuestas.

Suado

Suspendido
Mensajes
53
Puntuación de reacción
0
Hola, amigos soy nuevo y quiero compartir mis conocimientos de php, esta realizado en PDO

Base de dato:
PHP:
CREATE TABLE IF NOT EXISTS `user` (
  `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) NOT NULL,
  `password` varchar(60) NOT NULL,
  `date` varchar(19) NOT NULL,
  `ip` varchar(10) NOT NULL,
  PRIMARY KEY (`id`)
)
/config/index.php
PHP:
<?php
    $connection = new PDO("mysql:host=hosting;dbname=base de dato","usuario","contraseña");
    $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>
Index.php
PHP:
<?php
session_start();
include('/config/index.php');

if(isset($_SESSION['username'])):
    echo 'Estas logeado <a href="/logout.php">Logout</a>';
else:
    if(isset($_POST['login'])):
        if(empty($_POST['username']) || empty($_POST['password'])):
            echo 'No dejes campos en blanco';
        elseif(strlen($_POST['username']) > 20):
            echo 'El usuario no puede tener mas de 20 caracteres';
        elseif(strlen($_POST['password']) > 20):
            echo 'La contraseña no puede tener mas de 20 caracteres';
        else:
            $login = $connection->prepare("SELECT username FROM user WHERE username = :username AND password = :password");
            $login->bindParam(':username',$_POST['username']);
            $login->bindParam(':password',crypt($_POST['password'], '$2a$07$rieh3693fjarjeuf38cw27fg2$'));
            $login->execute();
            if($login = $login->fetch(PDO::FETCH_ASSOC)):
                $_SESSION['username'] = $_POST['username'];
                header('Location: /');
            else:
                echo 'Datos incorrectos';
            endif;
        endif;
    endif;
    echo '<form action="" method="post">
        <input name="username" placeholder="Username"><br>
        <input name="password" placeholder="Password"><br>
        <input name="login" type="submit">
    </form>
    
    <a href="/registro.php">Registrate</a>';
endif;
?>
Register.php
PHP:
<?php
session_start();
include('/config/index.php');

if(isset($_SESSION['username'])):
    header('Location: /');
else:
    if(isset($_POST['register'])):
        if(empty($_POST['username']) || empty($_POST['password'])):
            echo 'No dejes campos en blanco';
        elseif(strlen($_POST['username']) > 20):
            echo 'El usuario no puede tener mas de 20 caracteres';
        else:
            $user = $connection->prepare("SELECT username FROM user WHERE username = :username");
            $user->bindParam(':username',$_POST['username']);
            $user->execute();
            if($user->fetch(PDO::FETCH_ASSOC)):
                echo 'El usuario ya existe';
            elseif(strlen($_POST['password']) > 20):
                echo 'La contraseña no puede tener mas de 20 caracteres';
            elseif($_POST['password'] <> $_POST['password2']):
                echo 'Las contraseñas no coinciden';
            else:
                $register = $connection->prepare("INSERT INTO user(id,username,password,date,ip) VALUES ('',:username,:password,'".date('H:i:s d/m/Y')."','".$_SERVER['REMOTE_ADDR']."')");
                $register->bindParam(':username',$_POST['username']);
                $register->bindParam(':password',crypt($_POST['password'], '$2a$07$rieh3693fjarjeuf38cw27fg2$'));
                $register->execute();
                if($register->rowCount() > 0):
                    $_SESSION['username'] = $_POST['username'];
                    header('Location: /');
                else:
                    echo 'Ha ocurrido un error';
                endif;
            endif;
        endif;
    endif;
    echo '<form action="" method="post">
        <input name="username" placeholder="Username"><br>
        <input name="password" placeholder="Password"><br>
        <input name="password2" placeholder="Vuelve a ingresar la contraseña"><br>
        <input name="register" type="submit">
    </form>';
endif;
?>
Logout.php
PHP:
<?php
    session_start();
    session_destroy();
    header('Location: /');
?>
 

Jota Marquez

Administrador
Miembro del equipo
Usuario de Piedra
Usuario de Bronce
Mensajes
4,255
Puntuación de reacción
161
Cuando estaba en phperos, me encantaban estos posts, espero que sigas aportando así ;)

Un saludo!
 

lobogris

Platino
Usuario de Bronce
Mensajes
1,537
Puntuación de reacción
0
Un apunte, strlen cuenta los bytes y no los caracteres, si yo meto Óscar me devolverá '6 caracteres', es mejor que su utilices mb_strlen() o pasarle la cadena con utf8_decode
 

Luisin

Platino
Usuario de Bronce
Mensajes
1,253
Puntuación de reacción
1
Te faltó lo principal: El email
Podrias usar filter_var() para agregarle un poco mas de seguridad.

Esta bien el proposito del post(aprender), pero hay cientos de clases ya preparadas para hacer eso. Por que no usas alguna.

Saludos.
 

Suado

Suspendido
Mensajes
53
Puntuación de reacción
0
Te faltó lo principal: El email
Podrias usar filter_var() para agregarle un poco mas de seguridad.

Esta bien el proposito del post(aprender), pero hay cientos de clases ya preparadas para hacer eso. Por que no usas alguna.

Saludos.
Cientoa de clases para hacer el que realmente?

Muchas gracias a todos por contestar.

Otra aclaracion, despues de los header() es preferible utilizar exit();
 

jorged104

Piedra
Usuario de Piedra
Mensajes
38
Puntuación de reacción
0
Veo una sql injection en el login la solucion es ir a taer el usuario Solo el usuario sin comparar la contraseña y ya luego comparar la password porque sino te van vunerar
 
Mensajes
175
Puntuación de reacción
0
[emoji19] [emoji19] jaja

¿Que mas le añadirias tu?

Saludos.

Ahora mismo solo es un conunto de scripts acoplados. Yo lo miraría de encapsular todo en clases para facilitar su reutilización.

Aparte, para manejar los errores, en vez de imprimirlos, usa excepciones, para que el usuario cliente pueda decidir como tratarlos :)

Pero vamos, que no esta mal hecho, simplemente me ha llamado la atención que lo catalogues como "avanzado" cuando simplemente es una peticion ,una consulta a la base de datos y un par de validaciones :)

Un saludo
 
Última edición:

Suado

Suspendido
Mensajes
53
Puntuación de reacción
0
Ahora mismo solo es un conunto de scripts acoplados. Yo lo miraría de encapsular todo en clases para facilitar su reutilización.

Aparte, para manejar los errores, en vez de imprimirlos, usa excepciones, para que el usuario cliente pueda decidir como tratarlos :)

Pero vamos, que no esta mal hecho, simplemente me ha llamado la atención que lo catalogues como "avanzado" cuando simplemente es una peticion ,una consulta a la base de datos y un par de validaciones :)

Un saludo

Tienes algun sistema de login echo de esa manera?
Es para aprender mas.

Saludos.
 
Mensajes
175
Puntuación de reacción
0
Pues tendría que mirar pero no creo, la mayoría del codigo que escribo es para la empresa donde trabajo. Pero si te quieres dedicar profesionalmente te recomiendo que aprendas programación orientada a objetos, en internet encontrarás miles de libros y tutoriales.

Yo en su dia asistí a un curso online en SURFORCE Productos & Services / Cursos & Capacitación / PHP / PHP5 / MySQL / Zend Framework, la verdad esque estuvo muy bien y el profesor controla bastante sobre POO, no se si seguirá activo.

Un saludo
 

Suado

Suspendido
Mensajes
53
Puntuación de reacción
0
Pues tendría que mirar pero no creo, la mayoría del codigo que escribo es para la empresa donde trabajo. Pero si te quieres dedicar profesionalmente te recomiendo que aprendas programación orientada a objetos, en internet encontrarás miles de libros y tutoriales.

Yo en su dia asistí a un curso online en SURFORCE Productos & Services / Cursos & Capacitación / PHP / PHP5 / MySQL / Zend Framework, la verdad esque estuvo muy bien y el profesor controla bastante sobre POO, no se si seguirá activo.

Un saludo
PHP me lo tomo como hobby, ya que python django sera en un futuro la que utilizaran para la programacion web.

Al igual que tambien quiero aprender java y C++
 

lobogris

Platino
Usuario de Bronce
Mensajes
1,537
Puntuación de reacción
0
Tienes algun sistema de login echo de esa manera?
Es para aprender mas.

Saludos.

Pilla The PHP-LOGIN project no es mucho más avanzado, pero tiene un patrón MVC/OOP sencillo y claro que te ayudará.

Por otro lado sobre lo que dices de Django... habrá quien use Django, habrá quien use Rails y habrá quien use otros frameworks, si no tienes experiencia con ningún lenguaje yo me centraría en uno y a darle caña. Últimamente trabajo mucho sobre http://phalconphp.com/ y es una delicia, que deja, a mi parecer, a PHP por encima de muchos frameworks como Rail y Django, y por supuesto Laravel.
 

Suado

Suspendido
Mensajes
53
Puntuación de reacción
0
Pilla The PHP-LOGIN project no es mucho más avanzado, pero tiene un patrón MVC/OOP sencillo y claro que te ayudará.

Por otro lado sobre lo que dices de Django... habrá quien use Django, habrá quien use Rails y habrá quien use otros frameworks, si no tienes experiencia con ningún lenguaje yo me centraría en uno y a darle caña. Últimamente trabajo mucho sobre http://phalconphp.com/ y es una delicia, que deja, a mi parecer, a PHP por encima de muchos frameworks como Rail y Django, y por supuesto Laravel.
Django es un framework de Python. Aunque uses framework sigue siendo php
 
Estado
No está abierto para más respuestas.
Arriba