Prevenirea injectiilor SQL cu ajutorul Prepared Statements

Configurare noua (How To)

Situatie

Cu totii ne dorim sa avem parte de o infrastructura securizata, dar in cele mai multe cazuri putem pierde date importante din companie datorita atacurilor SQLi, exista mai multe solutii pentru prevenirea injectiilor SQL iar aceasta este una din ele.

Solutie

1. Ce este PDO?

PDO, un acronim pentru PHP Data Objects, este o extensie PHP care poate fi folosita ca un nivel de abstractizare pentru conexiunea dintre programele PHP si diverse baze de date. PDO defineste o interfata simpla si consistenta intre diverse baze de date. Pentru fiecare din driverele specifice implementate in PDO se pot folosi functiile specifice. PDO ofera un nivel de abstractizare pentru accesarea datelor, ceea ce inseamna ca indiferent la ce baza de date suntem conectati, se folosesc aceleasi functii pentru a trimite interogari si pentru a primi date. PDO nu ofera un nivel complet de abstractizare, nici transformare mapare automata in obiecte, nu rescrie SQL si nici nu emuleaza caracteristici absente in unele baze de date.

2. Conexiunea la baza de date

PHP Code:
$conexiune = new PDO("mysql:host=$db_host;$dbname=$db_name", $db_user, $db_pass);

Unde:
mysql – driver-ul folosit pentru a ne conecta la baza de date
$db_host = ‘localhost’;
$db_name = ‘numele bazei de date’;
$db_user = ‘userul cu care va conectati la server-ul MySQL’;
$db_pass = ‘parola cu care va conectati la server-ul MySQL’;

Modul default pentru erori este PDO::ERRMODE_SILENT. Ca sa-l schimbam si sa si afisam erorile(in caz ca sunt), punem totul intr-o structura try/catch.

PHP Code:
try {
$conexiune = new PDO("mysql:host=$db_host;$dbname=$db_name", $db_user, $db_pass);
$conexiune->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOExpcetion $e) {
echo: 'Eroare: ' . $e->getMessage();
}

Pentru mai multe detalii, intrati aici: PHP: Errors and error handling – Manual

3. Extragerea datelor
Sunt 2 moduri prin care putem extrage date din baza de date si anume:
a) query
b) execute

a) QUERY(nerecomandata)

PHP Code:
$username = $_POST['username'];
try {
$conexiune = new PDO("mysql:host=$db_host;$dbname=$db_name", $db_user, $db_pass);
$conexiune->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$data = $conexiune->query('SELECT * FROM tabela WHERE username = ' . $conexiune->quote($username));
foreach($data as $row) {
print_r($row);
}
} catch(PDOExpcetion $e) {
echo: 'Eroare: ' . $e->getMessage();
}

b) EXECUTE(recomandata)

PHP Code:
$id = 13;
try {
$conexiune = new PDO("mysql:host=$db_host;$dbname=$db_name", $db_user, $db_pass);
$conexiune->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$statement = $conexiune->prepare('SELECT * FROM tabela WHERE id = :id');
$statement->bindParam(':id', $id, PDO::PARAM_INT);
$statement->execute();
while($row = $statement->fetch()) {
print_r($row);
}
} catch(PDOExpcetion $e) {
echo: 'Eroare: ' . $e->getMessage();
}

4. Cateva exemple
a) Executii multiple

PHP Code:
try {
$conexiune = new PDO("mysql:host=$db_host;$dbname=$db_name", $db_user, $db_pass);
$conexiune->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$statement = $conexiune->prepare('INSERT INTO tabela VALUES(:username)');
$statement->bindParam(':username', $username,);
$username = "askit";
$statement->execute();
$username = "askit";
$statement->execute();
} catch(PDOExpcetion $e) {
echo: 'Eroare: ' . $e->getMessage();
}

b) INSERT

PHP Code:
try {
$conexiune = new PDO("mysql:host=$db_host;$dbname=$db_name", $db_user, $db_pass);
$conexiune->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$statement = $conexiune->prepare('INSERT INTO tabela VALUES(:username)');
$statement->execute(array(
':username' => 'askit'
));
} catch(PDOExpcetion $e) {
echo: 'Eroare: ' . $e->getMessage();
}

c) UPDATE

PHP Code:
$id = 13;
$username = "askit";
try {
$conexiune = new PDO("mysql:host=$db_host;$dbname=$db_name", $db_user, $db_pass);
$conexiune->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$statement = $conexiune->prepare('UPDATE tabela SET username = :username WHERE id = :id');
$stmt->execute(array(
':id'   => $id,
':username' => $username
));
} catch(PDOException $e) {
echo: 'Eroare: ' . $e->getMessage();
}

d) DELETE

PHP Code:
$id = 13;
try {
$conexiune = new PDO("mysql:host=$db_host;$dbname=$db_name", $db_user, $db_pass);
$conexiune->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$statement = $conexiune->prepare('DELETE FROM tabela WHERE id = :id');
$statement->bindParam(':id', $id);
$statement->execute();
} catch(PDOException $e) {
echo: 'Eroare: ' . $e->getMessage();
}

 

Tip solutie

Permanent

Voteaza

(36 din 62 persoane apreciaza acest articol)

Despre Autor

Leave A Comment?