Título: [Resuelto]Login solo en PHP Publicado por: danny920825 en 4 Enero 2017, 17:59 pm Hola a todos nuevamente. Me gustaría traerles un pequeño login que hice en PHP sin JQuery ni nada de eso. Solo PHP y HTML. Quisiera que me digan qué les parece el código y si hay formas de que usando solo PHP, no salga en el código fuente de la página la contraseña o que me digan cómo darle más seguridad al formulario y esas cosas. Sin dilatarnos más, veamos los 2 archivos:
Login.php Código La idea es que si ya tienes un login realizado no te deje acceder a esa página, sino que te redireccione al index.php. Ahora el logon.php que es quien gestiona los usuarios con la BD Código
Y así estamos listos. Yo recupero el nivel porque así puedo establecer permisos a los usuarios dependiendo de su nivel. Y en el login solo necesitamos recuperar las variables de sesion así Código
Título: Re: Login solo en PHP Publicado por: engel lex en 4 Enero 2017, 18:17 pm el login en lineas generales está bien, aunque debería tener algunas validaciones adicionales...
no uses $_REQUEST, usa ya sea $_POST o el método especifico las lineas 30 y 38 te causarán errores según documentación http://php.net/manual/es/function.header.php (http://i.imgur.com/TfuTd5s.png) si usas header, no usas nunca echo antes... y si es para redirect, tampoco es necesario despues porque no se verá (excepto el caso de una api que use no redirect) la contraseña está almacenada de forma insegura... base64 no es cifrar, es codificar, y las contraseñas deben estar almacenadas en forma de hash+salt ara evitar problemas.... la forma más simple de eso es usar password_hash (http://php.net/manual/es/function.password-hash.php) para guardar y password_verify (http://php.net/manual/es/function.password-verify.php) para comparar Título: Re: Login solo en PHP Publicado por: #!drvy en 4 Enero 2017, 18:47 pm Citar Código Eso no es cifrar. Eso es encoding o dicho en español: Codificación. Si lo que quieres es convertir la contraseña en un hash tendrás que usar un algoritmo de un solo camino. Preferiblemente bcrypt o scrypt. https://es.wikipedia.org/wiki/Codificaci%C3%B3n_de_caracteres https://es.wikipedia.org/wiki/Funci%C3%B3n_hash https://en.wikipedia.org/wiki/Bcrypt Código
Citar Código
Regla numero #1 del desarrollador: Nunca te fíes de lo que te manda un usuario. Ese código es vulnerable a SQLi (inyección sql). Puedes utilizar sentencias preparadas para evitar sqli. Por otro lado, evita usar $REQUEST. Solo quieres obtener datos que se envían por POST (tu formulario HTML). REQUEST incluye GET, POST y COOKIES.. no te interesa, mas bien perjudica. Código
http://php.net/manual/es/mysqli.quickstart.prepared-statements.php Citar Código
No uses == para comparar cadenas de texto. Puedes tener problemas porque PHP convierte a los valores a semejanza. Para que me entiendas: Código
Usa siempre === para comparar strings. Tampoco veo que estés comparando la contraseña hasheada.. comparas directamente dos cadenas de texto. Código
Y ya que vamos a utilizar bcrypt, mejor: Código
http://php.net/manual/es/function.crypt.php http://php.net/manual/es/function.hash-equals.php Citar Código
Primera regla. No nos fiemos. El usuario podría suplantar su "user" por el tuyo. Saca el userid siempre de la base de datos, de la entrada que corresponde a su usuario. Citar Código
echo no es una función. No la uses como tal (funciona pero esta mal). Utilizar header() después de imprimir algo suele tirar errores. Recuerda que en protocolo HTTP los headers siempre van antes que el contenido. En algunos navegadores, no pasar la url completa del sitio puede generar errores de redireccionamiento. Código
Saludos Título: Re: Login solo en PHP Publicado por: danny920825 en 4 Enero 2017, 19:01 pm Gracias por su pronta respuesta. Realmente el echo es infuncional, solo que copie el código de una salva anterior porque el original está en casa.
Código
Ya estoy viendo la documentacion que me dieron sobre el hash y salt y la cifrado en un solo sentido, así como el password verify y password hash. Para la comunicación con la BD no hay forma de encriptarla? que no se vea la contraseña en el código fuente? y esto no lo entiendo, lo podrían explicar? Código Gracias por adelantado Título: Re: Login solo en PHP Publicado por: #!drvy en 4 Enero 2017, 19:12 pm Citar Para la comunicación con la BD no hay forma de encriptarla? que no se vea la contraseña en el código fuente? Podrías ofuscarla y parecidos pero generalmente a fin de cuentas, no. Se asume que solo el administrador tiene acceso a dicho código. Citar y esto no lo entiendo, lo podrían explicar? mysqli_prepare, prepara una sentencia para que se le asignen parámetros y posteriormente sea ejecutada. Con las sentencias preparadas, en vez de enviar todos los datos en la query, envías primero la query y luego las variables. De este modo evitas que una variable puede escapar de su entorno y modifique la query. mysqli_stmt_bind_param, asigna un parámetro a una sentencia. En este caso, lo asignamos a $stmt que es nuestra sentencia. Le decimos que la próxima variable (el ? en la query) tipo string debe contener el valor de la variable $usuario. En reducidas cuentas, esto: Código
Pasa a ser esto: Código
Pero de forma segura. mysqli_stmt_execute lo que hace es ejecutar la sentencia y devolver un identificador para su posterior uso. Lo tienes todo bastante explicado en el enlace que te deje: http://php.net/manual/es/mysqli.quickstart.prepared-statements.php Saludos Título: Re: Login solo en PHP Publicado por: danny920825 en 4 Enero 2017, 19:17 pm Gracias por la ayuda, no habia visto ese enlace. Ya estoy estudiando. Si tengo otras dudas vuelvo. Es bueno saber que hay personas que responden en tiempo y que están dispuestas a ayudar.
|