PDO problema securitate

Buna ziua, cum fac sa nu am probleme de inject sql cu _POST

$email=$_POST['email'];
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'gran';
$userdb = 'gran';
$passdb = 'pa';

try {
  // Conectare si creare obiect PDO
  $dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
  $dbh->exec("SET CHARACTER SET utf8");      // Setare encoding caractere UTF-8

  // Adaugare date
  $sql = "INSERT INTO `newsletter` (`email`,`data`)
    VALUES
      ('".$email."', NOW())";

  $count = $dbh->exec($sql);

  $dbh = null;        // Deconectare
}
catch(PDOException $e) {
  echo $e->getMessage();
}

// Daca datele au fost adaugate ($coun nu e false) afiseaza nr. randuri adaugate
if($count !== false) echo 'Nr. randuri adaugate: '. $count;

Un început ar fi să folosești prepared statements. E.g.

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

PS: pentru coloana data poți folosi default value în schema sql.

6 Likes

Prepared statements, asa cum a spus @iamntz si desigur verifica daca in $_POST['email'] iti vine un e-mail valid. Poti face asta cu filter_var($_POST['email'], FILTER_VALIDATE_EMAIL).

Nu are legatura neaparat cu securitatea, insa poti sa scapi de a linia

$dbh->exec("SET CHARACTER SET utf8");

punand

$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

3 Likes

@Cosmin ce a pus @iamntz este prima metoda de securitate, pentru ca mysql asteapta parametrii name si value; nu poti face injectie

Mod de executie:
a)
$result = mysql_query("INSERT INTO example (name, age) VALUES('Timmy Mellowman', '23' )");
-> step 1 & step 2 (1 executie)

b)
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); -> step 1 (asteapta)
$stmt->bindParam(':name', $name); -> step 2
$stmt->bindParam(':value', $value); -> step 2
-> step 1 & step 2 (2 executii)

filter_var($_POST[‘email’], FILTER_VALIDATE_EMAIL) -> personal am avut ceva probleme cu functia asta pentru domeniile noi gen .shop, .online, .club, .xyz, .site , .rocks , .life , .tech, .cloud, .world etc. si varianta de php folosita (pentru shared hosting).

1 Like