Login cu prepared statements

Secţiune dedicată începatorilor.

Moderatori: Moderatori, Start Moderator

Avatar utilizator
cristivstan
PHPRomania Supporter
Mesaje: 9
Membru din: Joi Noi 17, 2016 6:40 pm

Login cu prepared statements

Mesajde cristivstan » Dum Dec 03, 2017 8:41 pm

Salutare,

Lucrez la un website cu login si panou de administrare si as vrea sa stiu daca am codat corect folosind prepared statements. Mai jos este codul.

connect.php

Cod: Selectaţi tot

<?php

try {
      $conn = new PDO('mysql:host=localhost;dbname=name', 'user', '');
      $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   }
   catch(PDOExpetion $e) {
      echo $e->getMessage();
      die();
   }
   
<?


login.php

Cod: Selectaţi tot

<?php
ob_start();
   
   include('connect.php');

   session_start();
   
   if (isset($_POST['login_btm']))
   {
      $username = $_POST['user'];
      $pass = $_POST['pass'];
      
      $sql = "SELECT * FROM users WHERE username=:username AND pass=:pass";

          $query = $conn->prepare($sql);

          $query->execute(array(
                ':username' => $username,
                ':pass' => $pass
             ));

         $rows = $query->fetch();

         if($query->rowCount())
         {
            $_SESSION['id']=$rows['id_user'];
            $_SESSION['username']=$username;
            header('location: overview.php');
         }
         else
         {
            $_SESSION['message'] = 'Username/parola gresit/a';
            header('Location: index.php');
            exit();
         }
?>   


Exista (si) alta metoda pentru a evita SQL Injection?


Ofer servicii de administrare si creare site-uri si scriu despre istoria fotbalului si statistici pe 90deminute.ro

nevvermind
Senior Member
Mesaje: 1264
Membru din: Mar Iun 22, 2010 3:17 pm

Re: Login cu prepared statements

Mesajde nevvermind » Dum Dec 03, 2017 9:42 pm

Iti da eroare sau ce? Arata bine.

Si da, deocamdata prepared statements si o doza buna de scepticism in ceea ce priveste inputul primit de la user sunt cele mai bune metode.

PS: Nu mai folosi "?>" in scripturi PHP. Fac mai multe probleme decat ajuta. Scapa de ele.
Facusi un canal de php pe freenode - ##php-ro : https://webchat.freenode.net/

Memphistoles
PHPRomania Supporter
Mesaje: 9
Membru din: Lun Aug 08, 2016 10:59 am

Re: Login cu prepared statements

Mesajde Memphistoles » Mar Dec 05, 2017 11:30 am

Salut,

Cateva sfaturi:

Nu stoca niciodata parola in db in felul acesta.Cripteaz-o folosind o functie de hashing.Acum ceva timp,md5/sha512 era baza plus 2 notiuni de criptografie: salt & pepper.Acum php are o functie care te rezolva: password_hash(http://php.net/manual/ro/function.password-hash.php).
O sa gasesti explicatii elaborate cum sa structurezi script-urile de register/login conform best practices,in special pe SO(https://stackoverflow.com/questions/401 ... words?rq=1) dar pe scurt,ideea e sa stochezi parola hashuita in db iar la fiecare login sa compari password_hash($user_value) cu $db_pass_value.

Un alt sfat ar fii sa pui scriptul de conectare cu db-ul, inafara zonei de acces a userului(majoritatea web serverelor au public_html care poate fii accesat direct de catre user).
O alta chestie ar fii sa accepti doar tipul de valoare pe care-l astepti dintr-un input.Ex: prin $_POST['id'] te astepti sa vina doar tipul integer si atunci filtrezi valoarea: (int)$_POST['id'] / intval($_POST['id']),etc etc

Ar fii multe alte lucruri de zis,securitatea este unul dintre cele mai importante puncte in programare,daca nu cel mai.
Documenteaza-te foarte bine inainte:) .Spor si daca ai nevoie de ajutor,private message

Avatar utilizator
Jetix
Average Member
Mesaje: 66
Membru din: Mie Aug 09, 2017 3:16 am
Contact:

Re: Login cu prepared statements

Mesajde Jetix » Vin Mar 30, 2018 9:59 pm

L-am modificat putin.

Cod: Selectaţi tot

<?php
ob_start();
session_start();

include('connect.php');

function get_username_from_id($id) {
   $st =  $conn->prepare("SELECT `username` FROM `users` WHERE `id_user` = :user_id;");
   $st->bindValue(':user_id', $id, PDO::PARAM_INT);
   $st->execute();

   foreach ($st->fetchAll() as $r) {
      return $r['username'];
   }
}

if (isset($_POST['login_btm'])) {
   $username = htmlspecialchars(strip_tags($_POST['user']));
   $pass = htmlspecialchars(strip_tags($_POST['pass']));

   $sql = "SELECT * FROM `users` WHERE `username` = :username AND `pass` = :pass";
   $query = $conn->prepare($sql);
   $query = bindValue(':username', $username, PDO::PARAM_STR);
   $query = bindValue(':pass', $pass, PDO::PARAM_STR);
   $query->execute();

   $rows = $query->fetchAll(PDO::FETCH_ASSOC);

   if($query->rowCount() > 0) {
      $_SESSION['id'] = $rows['id_user'];
      $_SESSION['username'] = get_username_from_id($_SESSION['id']);
      header('location: overview.php');
   } else {
      $_SESSION['message'] = 'Username / parola gresit/a';
      header('Location: index.php');
      exit();
   }
?> 


Înapoi la “PHP Incepători”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 63 vizitatori