a73csx
(Alex)
martie 6, 2017, 5:32pm
1
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;
iamntz
(Ionuț Staicu)
martie 6, 2017, 5:37pm
2
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
Cosmin
(Cosmin)
martie 6, 2017, 5:46pm
3
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
pur4u
(Ovidiu L.)
martie 7, 2017, 9:19am
4
@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