Un simple sistema de inicio de sesión PHP -- beginner campo con php campo con sql campo con authentication campo con pdo camp codereview Relacionados El problema

A simple PHP login system


2
vote

problema

Español

Soy súper nuevo en PHP y estoy tratando de obtener un sistema de inicio de sesión funcional juntos. Este es el código que tengo:

clase / user.php

  <?php  class Users {      public $username = null;      public $password = null;      public $salt = "Zo4rU5Z1YyKJAASY0PT6EUg7BBYdlEhPaNLuxAwU8lqu1ElzHv0Ri7EM6irpx5w";       public function __construct( $data = array() ) {          if( isset( $data['username'] ) ) $this->username = stripslashes( strip_tags( $data['username'] ) );          if( isset( $data['password'] ) ) $this->password = stripslashes( strip_tags( $data['password'] ) );      }       public function storeFormValues( $params ) {         //store the parameters         $this->__construct( $params );       }       public function userLogin() {          $success = false;          try{             $con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );              $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );             $sql = "SELECT * FROM users WHERE username = :username AND password = :password LIMIT 1";              $stmt = $con->prepare( $sql );             $stmt->bindValue( "username", $this->username, PDO::PARAM_STR );             $stmt->bindValue( "password", hash("sha256", $this->password . $this->salt), PDO::PARAM_STR );             $stmt->execute();              $valid = $stmt->fetchColumn();              if( $valid ) {                 $success = true;             }              $con = null;             return $success;          }catch (PDOException $e) {              echo $e->getMessage();              return $success;          }      }       public function register() {         $correct = false;             try {                 $con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );                 $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );                 $sql = "INSERT INTO users(username, password) VALUES(:username, :password)";                  $stmt = $con->prepare( $sql );                 $stmt->bindValue( "username", $this->username, PDO::PARAM_STR );                 $stmt->bindValue( "password", hash("sha256", $this->password . $this->salt), PDO::PARAM_STR );                 $stmt->execute();                 return "Registration Successful <br/> <a href='index.php'>Login Now</a>";             }catch( PDOException $e ) {                 return $e->getMessage();             }      }   }  ?>   

login.php

  (function () { 'use strict';  var serviceId = 'datacontext'; angular.module('app').factory(serviceId,     ['common', datacontext]);  function datacontext(common) {     var service = {          getAllTagsByHttp: getAllTagsByHttp,         getBlogPostsByHttp: getBlogPostsByHttp,         getAllUserPicByHttp: getAllUserPicByHttp      };     return service;      function getAllTagsByHttp() {        return common.$http.get('/api/TagApi/alltags');              }      function getBlogPostsByHttp() {         return common.$http.get('/api/BlogPostApi/AllBlogPosts');     }      function getAllUserPicByHttp() {         return common.$http.get('/api/BlogPostApi/AllUserPic');     }    }})(); 0  

register.php

  (function () { 'use strict';  var serviceId = 'datacontext'; angular.module('app').factory(serviceId,     ['common', datacontext]);  function datacontext(common) {     var service = {          getAllTagsByHttp: getAllTagsByHttp,         getBlogPostsByHttp: getBlogPostsByHttp,         getAllUserPicByHttp: getAllUserPicByHttp      };     return service;      function getAllTagsByHttp() {        return common.$http.get('/api/TagApi/alltags');              }      function getBlogPostsByHttp() {         return common.$http.get('/api/BlogPostApi/AllBlogPosts');     }      function getAllUserPicByHttp() {         return common.$http.get('/api/BlogPostApi/AllUserPic');     }    }})(); 1  

Estoy realmente interesado en saber cómo está estructurado este código, ya que usé información de varios tutoriales diferentes combinados para crearlo. Cualquier entrada sería apreciada.

Original en ingles

I'm super new to PHP and I'm trying to get a functional login system together. This is the code I have:

class/user.php

<?php  class Users {      public $username = null;      public $password = null;      public $salt = "Zo4rU5Z1YyKJAASY0PT6EUg7BBYdlEhPaNLuxAwU8lqu1ElzHv0Ri7EM6irpx5w";       public function __construct( $data = array() ) {          if( isset( $data['username'] ) ) $this->username = stripslashes( strip_tags( $data['username'] ) );          if( isset( $data['password'] ) ) $this->password = stripslashes( strip_tags( $data['password'] ) );      }       public function storeFormValues( $params ) {         //store the parameters         $this->__construct( $params );       }       public function userLogin() {          $success = false;          try{             $con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );              $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );             $sql = "SELECT * FROM users WHERE username = :username AND password = :password LIMIT 1";              $stmt = $con->prepare( $sql );             $stmt->bindValue( "username", $this->username, PDO::PARAM_STR );             $stmt->bindValue( "password", hash("sha256", $this->password . $this->salt), PDO::PARAM_STR );             $stmt->execute();              $valid = $stmt->fetchColumn();              if( $valid ) {                 $success = true;             }              $con = null;             return $success;          }catch (PDOException $e) {              echo $e->getMessage();              return $success;          }      }       public function register() {         $correct = false;             try {                 $con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );                 $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );                 $sql = "INSERT INTO users(username, password) VALUES(:username, :password)";                  $stmt = $con->prepare( $sql );                 $stmt->bindValue( "username", $this->username, PDO::PARAM_STR );                 $stmt->bindValue( "password", hash("sha256", $this->password . $this->salt), PDO::PARAM_STR );                 $stmt->execute();                 return "Registration Successful <br/> <a href='index.php'>Login Now</a>";             }catch( PDOException $e ) {                 return $e->getMessage();             }      }   }  ?> 

login.php

<?php      include_once("config.php"); ?> <?php if( !(isset( $_POST['login'] ) ) ) { ?>     <form method="post" action="">         <input type="text" maxlength="30" required autofocus name="username" />         <input type="password" maxlength="30" required name="password" />         <input type="submit" name="login" value="Log me in" />     </form> <?php  } else {     $usr = new Users;     $usr->storeFormValues( $_POST );      if( $usr->userLogin() ) {         echo "Welcome";      } else {         echo "Incorrect Username/Password";      } } ?> 

register.php

<?php      include_once("config.php"); ?>  <?php if( !(isset( $_POST['register'] ) ) ) { ?>     <form method="post">         <input type="text" id="usn" maxlength="30" required autofocus name="username" />         <input type="password" id="passwd" maxlength="30" required name="password" />         <input type="password" id="conpasswd" maxlength="30" required name="conpassword" />         <input type="submit" name="register" value="Register" />     </form>  <?php  } else {     $usr = new Users;     $usr->storeFormValues( $_POST );      if( $_POST['password'] == $_POST['conpassword'] ) {         echo $usr->register($_POST);         } else {         echo "Password and Confirm password not match";      } } ?> 

I am really keen to know how this code is structured, as I used information from several different tutorials combined to create it. Any input would be appreciated.

              

Lista de respuestas

6
 
vote
vote
La mejor respuesta
 

Manipulación de datos y amp; Seguridad

Usted utiliza declaraciones preparadas, que lo protege de la inyección de SQL, que es buena. Sin embargo, la forma en que maneja las contraseñas podría mejorarse para aumentar la seguridad.

No es una buena idea aplicar las funciones de saneamiento semi-aleatoriamente a la entrada del usuario, ya que se traduce en datos sucios.

stripslashes Por ejemplo, solo tiene sentido cuando se habilita las cotizaciones mágicas, por lo que debe verificar que primero (y luego solo banda las barras en algún archivo init, no cada vez que acceda a obtener). Por ejemplo, si un usuario tiene una contraseña como esta: a'b\c'd , las barras de desmonte reducen la longitud de la contraseña de 9 a 6 caracteres.

mismo problema con strip_tags , solo mucho peor. Si mi contraseña es a<super$secure!password , ahora, mi contraseña es a .

También no necesita strip_tags . Como protección XSS, no es suficiente de todos modos (y definitivamente no es necesario para las contraseñas, que no se hacen eco); Debe codificar los datos de HTML cuando lo eco en su lugar.

Realmente no hay necesidad de tener una restricción de longitud en la contraseña, especialmente no una que sea más corta de lo que permite el algoritmo de hashing.

hashing

SIMPLE SHA es realmente lo suficientemente bueno , ya que es demasiado rapido. Use bcrypt en su lugar.

Manipulación de errores

No haga clic en Mensajes de error de base de datos directamente al enduser. No sabrán qué hacer con él, y puede proporcionar a los atacantes información o permitir algunas formas de ataques (como inyección de SQL basada en errores).

Tampoco es una buena idea hacer eco de cualquier cosa en una función, como los efectos secundarios como los que hacen que sea más difícil de reutilizar.

estructura

Creo que su estructura es bastante limpia, y su código sea fácil de leer. Sólo un par de puntos pequeños:

storeFormValues no parece tener ningún propósito. No llamaría al constructor dentro de una función de la misma clase, pero solo usarlo directamente.

También no pasaría una matriz mágica al constructor, ya que es difícil de usar y reutilizar (tengo que adivinar cómo debe construirse la matriz y lo que debe contener, y tengo que usar las teclas de matriz predefinida ).

En su lugar, simplemente cambie su constructor a __construct($username, $password) . Esto aumenta la claridad y reduce los insectos futuros.

misc

  • Eliminar variables no utilizadas como $correct .
  • Los comentarios, como //store the parameters no se necesitan, ya que no agregan ninguna información.
  • Las mismas cosas deben ser nombradas de la misma manera para evitar la confusión. Por ejemplo, registrarse y iniciar sesión son bastante similares. Pero los nombres a'b\c'd0 y a'b\c'd1 se construyen de manera diferente. Simplemente use a'b\c'd2 y a'b\c'd3 .
 

Data Handling & Security

You use prepared statements, which protects you from SQL injection, which is good. However, the way you handle passwords could be improved to increase security.

It's not a good idea to semi-randomly apply sanitation functions to user input as it results in dirty data.

stripslashes for example really only makes sense when magic quotes is enabled, so you should check that first (and then only strip the slashes in some init file, not every time you access GET). For example, if a user has a password like this: a\'b\\c\'d, stripping slashes reduces the password length from 9 to 6 characters.

Same problem with strip_tags, only much worse. If my password is a<super$secure!password, now my password is a.

You also don't need strip_tags. As XSS protection it's not sufficient anyways (and definitely not needed for passwords, which aren't echoed); You should HTML-encode data when echoing it instead.

There's also really no need to have a length restriction on the password, especially not one that is shorter than what your hashing algorithm allows.

Hashing

Simple sha is really not good enough anymore, as it's too fast. Use bcrypt instead.

Error Handling

Don't echo database error messages directly to the enduser. They won't know what to do with it, and it may provide attackers with information or enable some forms of attacks (such as error based SQL injection).

It's also not a good idea to echo anything in a function, as side-effects like that make it harder to reuse.

Structure

I think your structure is pretty clean, and your code easy to read. Just a couple of small points:

storeFormValues doesn't seem to have any purpose. I wouldn't call the constructor inside a function of the same class, but just use it directly.

I would also not pass a magic array to the constructor, as it's hard to use and reuse (I have to guess how the array must be build and what it must contain, and I have to use the pre-defined array keys).

Instead, just change your constructor to __construct($username, $password). This increases clarity and reduces future bugs.

Misc

  • remove unused variables such as $correct.
  • comments such as //store the parameters are not really needed as they don't add any information.
  • same things should be named in the same way to avoid confusion. For example, registering and logging in are quite similar. But the names userLogin and register are constructed differently. Just use login and register.
 
 
 
 
0
 
vote

No habría hablado demasiado en el resto de su código, pero su función 99887766555443314 no pertenece a su clase de usuario ..

En nota corta, una clase de usuario debe ser algo así.

  a'b\c'd6  
Se supone que el objeto

se debe usar para la aplicación de nombres y para tratar los datos. Su clase anterior contiene funciones no relacionadas con los datos para la clase de usuarios.

a'b\c'd7 Utiliza principalmente los datos suministrados por los usuarios Los usuarios del formulario de datos son irrelevantes para la clase de usuario que obtiene datos de TI de la base de datos utilizando la sesión, nombre de usuario desde el inicio de sesión, etc.

Mejor enfoque es

  a'b\c'd8  

Haz lo mismo para el inicio de sesión del usuario .... Infactar el inicio de sesión del usuario no necesita ser una clase ni una función, pero podría crear una clase de validador , aconsejo que debe usar el procedimiento. < / p>

antes de hacer una clase OOP o construir. Piense en los datos que necesita para trabajar ... Pregunte qué son los comportamientos.

 

I wouldn't talk too much on on the rest of your code but your userLogin() and Register() function does not belong to your user class..

In short note a user class should be something like..

<?php     class user(){        //user property/profile        protected $username;        protected Lang = lang;          //user behaviour          public change_password();          public change_lang();          private setup();          protected addLang();          public getLang;      }; 

Object are supposed to be used for namespacing and dealing with data. Your above class contains functions not related to data for users class.

register() primarily uses data supplied data users form input which is irrelevant to user class that gets it data from database using session, username from login etc.

Better approach is

<?php     class Register{         //register data gotten from input         //validate input         //submit to database and send.         //email verification messages     } ?> 

Do same thing for user login.... Infact User login do not need to be a class nor a function but you could create a Validator class instead, I advise you should use procedural.

Before you do OOP or build class. Think of the data you wil need to work on... Ask what are it behaviours.

 
 
       
       

Relacionados problema

1  Categorizar y Sub clasificar desde el contenido de una fila y más ejecute aún más consultas en resultados  ( Categorize sub categorize from contents of one row and more execute even more ) 
Tengo una tabla llamada sales y tiene debajo de las columnas: 'id' 'product_type' 'soldDate' 'text' 'product_type' Ejemplos: Tshirt-XL , Tshirt-L...

1  Un sistema similar / a diferencia de MySQL y PDO  ( A like unlike system using mysql and pdo ) 
He creado un sistema similar / a diferencia. El usuario hace clic en uno para indicar un "Me gusta" y hacer clic nuevamente para "A diferencia de". Actualment...

8  Clase de base de datos usando PDO  ( Database class using pdo ) 
el punto de esta pregunta En realidad, lo estoy usando mientras desarrolla una aplicación simple y parece cubrir todas mis necesidades. También utiliza PD...

4  Consulta para trazar un histograma de calificaciones de canciones  ( Query to plot a histogram of song ratings ) 
Escribí código para trazar una distribución de calificación, que se parece a esto: La función más importante es el stats Función: function stats($so...

2  Adquiriendo información de los empleados  ( Acquiring employee information ) 
Tengo curiosidad por saber si hay una forma más rápida, mejor y más eficiente de lograr este programa que adquiere información de los empleados: <?php ...

9  Método de base de datos para consultar  ( Database method to query ) 
Tengo una clase de base de datos que en __construct() Inicialice una conexión PDO e inserte la instancia en un VAR privado de $ dB. Ahora estoy trabajando e...

5  Autenticación de inicio de sesión PHP con BCIPTPT  ( Php login authentication with bcrypt ) 
Tengo un script de autenticación PHP y todo funciona bien, pero no estoy seguro de la forma en que lo programé (i hard codificé algunas cosas). Esperaba que l...

0  Formulario de sintaxis PDO  ( Syntax form pdo ) 
Pudo ejecutar el formulario para actualizar los datos del perfil de usuario, por el momento está en una versión aproximada, pero sé que se puede mejorar. Pu...

4  Conexión PDO (MYSQL) y Clase de consulta, seguridad y lógica  ( Pdo mysql connection and query class safety and logic ) 
Durante los últimos días, intenté averiguar cómo trabajar con MySQL y PDO. Aunque he tratado de leer mucho sobre el tema, todavía hay muchas cosas que no enti...

5  ¿Hay algún problema para revisar la conexión PHP PDO de esta manera?  ( Is there any problem in checking php pdo connection this manner ) 
¿Hay algún problema para revisar la conexión PHP PDO de esta manera? es de esta manera confiable? function pdo_mysql() { $mysql_string = "xxxxxxxxxxx"; ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos