Prevención de la inyección de SQL en la rutina de registro de usuarios -- php campo con mysql campo con security campo con pdo campo con authentication camp codereview Relacionados El problema

Preventing SQL Injection in user registration routine


6
vote

problema

Español

En este momento es mi código seguro para las inyecciones de SQL y así sucesivamente? Todavía necesito las contraseñas de hash y asegúrese de que los campos sean válidos y así sucesivamente.

  <?php  try{     $handler = new PDO('mysql:host=localhost;dbname=s','root', '*');     $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); }  catch(PDOException $e){     echo $e->getMessage();     die(); }  $name = $_POST['name'];  $username = $_POST['username'];  $email = $_POST['email'];    $password = $_POST['password'];   $sql = "INSERT INTO userinfo (name ,username, email, password) VALUES (:name,:username,:email,:password)"; $query = $handler->prepare($sql);  $query->execute(array(           ':name' => $name,     ':username' => $username,     ':email' => $email,     ':password' => $password ));  ?>   
Original en ingles

At the moment is my code secure for SQL injections and so forth? I still need to hash passwords and make sure fields are valid and so forth.

<?php  try{     $handler = new PDO('mysql:host=localhost;dbname=s','root', '*');     $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); }  catch(PDOException $e){     echo $e->getMessage();     die(); }  $name = $_POST['name'];  $username = $_POST['username'];  $email = $_POST['email'];    $password = $_POST['password'];   $sql = "INSERT INTO userinfo (name ,username, email, password) VALUES (:name,:username,:email,:password)"; $query = $handler->prepare($sql);  $query->execute(array(           ':name' => $name,     ':username' => $username,     ':email' => $email,     ':password' => $password ));  ?> 
              
         
         

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 

es seguro.

Puede mejorar su código como este:

  • No es necesario usar el cierre Array.prototype.push.apply2 En caso de que no esté enviando ningún HTML / o algo más después de su código PHP
  • No es necesario usar Array.prototype.push.apply3 Para envolver cuerdas en caso de que no tenga variables dentro de una cadena, puede usar 99887776655443324 en su lugar, el intérprete PHP no necesita para comprobar en ese caso si hay variables en la cadena o no
  • Puede reemplazar Array.prototype.push.apply5 by Simplier Array.prototype.push.apply6
  • Agregué la generación de sal a su código Array.prototype.push.apply7
  • Añadido la contraseña Hashing a su código mediante 99887776655443328

Todo el código personal:

  Array.prototype.push.apply9  
 

It is safe.

You can improve your code like this:

  • no need to use closing ?> in case that you are not outputting any HTML / or something else after your PHP code
  • no need to use "" to wrap strings in case that you don't have any variables inside a string, you can use '' instead, PHP interpreter does not need to check in that case whether there are any variables in the string or not
  • you can replace echo $e->getMessage; die() by simplier exit($e->getMessage());
  • I added salt generation to your code $salt = md5(uniqid(null, true));
  • I added password hashing to your code by $password = hash('sha256', $password . $salt);

The whole code hereunder:

<?php  try {     $handler = new PDO('mysql:host=localhost;dbname=s','root', '*');     $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e){     exit($e->getMessage()); }  $name = $_POST['name']; $username = $_POST['username']; $email = $_POST['email']; $password = $_POST['password'];  $salt = md5(uniqid(null, true)); $password = hash('sha256', $password . $salt);  $sql = '     INSERT INTO userinfo          (name ,username, email, password, salt)      VALUES          (:name,:username,:email,:password, :salt) ';  $query = $handler->prepare($sql);  $query->execute(array(     ':name' => $name,     ':username' => $username,     ':email' => $email,     ':password' => $password,     ':salt' => $salt )); 
 
 
       
       
0
 
vote

Yoda tiene algunos puntos buenos, y estoy de acuerdo con que esté seguro. Noté que mencionaste validando, pero pensé que agregué mis 2 centavos para futuros lectores que pueden encontrar esta pregunta. Algunas cosas saltan de lo siguiente:

  $name = $_POST['name']; $username = $_POST['username']; $email = $_POST['email']; $password = $_POST['password'];   

Debe verificar que todos los campos se hayan publicado y detenga el procesamiento si falta la información. Un ejemplo de esto sería:

  $name = isset($_POST['name']) ? $_POST['name'] : null; if($name==null) {      exit();  }   

Esta información se está ingresando en la base de datos sin ningún cheque, lo que puede llevar a que se almacenen malos datos. Estoy asumiendo que puede haber cheques lateral del cliente (navegador), pero esas verificaciones no son de ninguna manera a prueba de tontos. JavaScript podría ser deshabilitado, con los cheques inútiles. Hay required para HTML5, y algunos navegadores han implementado esa funcionalidad. Sin embargo, no todos tienen, y muchos usuarios inevitablemente usarán las versiones anteriores que no lo han hecho. ¿Qué sucede si el nombre y el nombre de usuario están en blanco, o el nombre es 31&^5 ? Comprobar la longitud y el contenido deben realizarse tanto en el cliente como en el servidor.

+1 para declaraciones preparadas!

 

Yoda has some good points, and I agree with it being safe. I noticed you mentioned validating, but I figured I'd add my 2 cents for future readers that may come across this question. A few things jump out at me from the following:

$name = $_POST['name']; $username = $_POST['username']; $email = $_POST['email']; $password = $_POST['password']; 

You should check that all fields have been posted, and stop processing if there is information missing. An example of this would be:

$name = isset($_POST['name']) ? $_POST['name'] : null; if($name==null) {      exit();  } 

This information is being entered into the database without any checks, which can lead to bad data being stored. I'm assuming that there may be checks client side (browser), but those checks are by no means fool-proof. Javascript could be disabled, rending those checks useless. There is required for HTML5, and some browsers have implemented that functionality. However, not all have, and many users will inevitably be using the older versions that haven't. What if the name and username are blank, or the name is 31&^5. Checking the length and content should be done both on the client and the server.

+1 for prepared statements!

 
 

Relacionados problema

6  Autenticación de usuario / Permisos para PHP MySQL Crud  ( User authentication permissions for php mysql crud ) 
Tomé mi primera puñalada en una función de autenticación de usuario. Inventé mi propia forma de hacer esto. ¿Es esta una forma segura y eficiente de darle un ...

12  Autenticación simple en ASP.NET MVC 5  ( Simple authentication in asp net mvc 5 ) 
Estoy construyendo una aplicación ASP.NET MVC 5 y, por razones que son irrelevantes en este punto, estoy intentando construir mi propio medio para autenticar ...

3  Autenticación de registro de usuario  ( User logging authentication ) 
Estoy poco frustrado porque no sé qué tan bien puedo refactorizar este script. Escribí la función de autenticación, pero es demasiado complicada, tal vez dema...

6  Programa de recuperación de contraseña  ( Password recovery program ) 
Este es un programa de recuperación de contraseña que hice, y solo quiero que se revise. Estos no son todos los archivos para el sistema de inicio de sesión y...

2  Un script de inicio de sesión de MySQLi de procedimiento muy seguro contra inyecciones  ( A very secure procedural mysqli login script against injections ) 
Sé que hay otras formas de crear un script de inicio de sesión como objetos orientados a objetos, declaraciones preparadas y PDO, pero ¿qué hay de los viejos ...

3  Forma aceptable de usar métodos jQuery en directivas angulares  ( Acceptable way of using jquery methods in angular directives ) 
aquí es mi ejemplo de plunker de lo que estoy haciendo. jQuery es una excelente manera de usar transiciones de diapositivas y parece funcionar bien con an...

6  Sistema de inicio de sesión con sesión usando CodeIgniter  ( Login system with session using codeigniter ) 
Implementé un sistema de inicio de sesión, con sesión, utilizando CodeIgniter. Si la sesión no existe, redirige a la página de inicio de sesión. Por favor rev...

9  Primer sistema de inicio de sesión PHP  ( First php login system ) 
¡Este es mi primer intento de un sistema de inicio de sesión! Solo he tenido aproximadamente 2 días de experiencia con MySQL y PHP hasta ahora y esto es lo qu...

-5  Autenticación segura del usuario en PHP [CERRADO]  ( Secure user authentication on php ) 
cerrado . Esta pregunta necesita detalles o claridad . Actualmente no está aceptando respuestas. ...

6  Este loginpane es un dolor  ( This loginpane is a pain ) 
Bueno, realmente no es un gran dolor: pero temo a los riesgos de seguridad (si eso es posible). Fondo: Decidí (tipo de) abandono mi proyecto sudoku (porqu...




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