Documente Academic
Documente Profesional
Documente Cultură
In primul si al doilea tutorial am invatat cum sa ne conectam la baza de date MySQL folosind o metoda
„moderna“, PDO sa adaugam sa afisam si sa modificam inregistrari in PHP/MySQL.
In acest tutorial invatam cum sa stergem date si cum sa protejam aplicatia folosind CSRF
Cerinte preliminarii:
Scopuri:
- Crearea unei pagini care listeaza toti utilizatorii cu un buton “delete“ asociat fiecarui
nume
- Crearea unui cod de securitate si introducerea lui in aplicatie
Dacă ati efectuat primul si al doilea tutorial , veți avea tot codul de care aveți nevoie pentru a începe să
lucrati.
Dacă nu aveti codul din primul si al doilea tutorial, puteți descărca întregul cod și îl puteți plasa în
rădăcina serverului dvs.
Tot ceea ce vom edita este în folderul „public“, deoarece toate configurațiile noastre inițiale raman
aceleasi. Pregătește totul pentru a lucra din punctul in care l-am lăsat, și apoi putem continua.
<ul>
<li><a href="create.php"><strong>Create</strong></a> - add a user</li>
<li><a href="read.php"><strong>Read</strong></a> - find a user</li>
<li><a href="update.php"><strong>Update</strong></a> - edit a user</li>
<li><a href="delete.php"><strong>Delete</strong></a> - delete a user</li>
</ul>
Cream un fisier nou cu numele delete.php. seamana foarte mult cu fisierul update.php. Copiem codul din
update.php dar schimbam „edit“ cu „delete“ si și vom verifica din nou variabila globala primita cu $ _GET. Dacă
id-ul incarcat in URLeste corect , PHP va șterge acel utilizator.
- Vertraulich / Confidential -
/**
* Delete a user
*/
require "../config.php";
require "../common.php";
if (isset($_GET["id"])) {
try {
$connection = new PDO($dsn, $username, $password, $options);
$id = $_GET["id"];
$statement = $connection->prepare($sql);
$statement->bindValue(':id', $id);
$statement->execute();
try {
$connection = new PDO($dsn, $username, $password, $options);
$statement = $connection->prepare($sql);
$statement->execute();
$result = $statement->fetchAll();
} catch(PDOException $error) {
echo $sql . "<br>" . $error->getMessage();
}
?>
<?php require "templates/header.php"; ?>
<h2>Delete users</h2>
<table>
<thead>
<tr>
- Vertraulich / Confidential -
<th>#</th>
<th>First Name</th>
<th>Last Name</th>
<th>Email Address</th>
<th>Age</th>
<th>Location</th>
<th>Date</th>
<th>Delete</th>
</tr>
</thead>
<tbody>
<?php foreach ($result as $row) : ?>
<tr>
<td><?php echo escape($row["id"]); ?></td>
<td><?php echo escape($row["firstname"]); ?></td>
<td><?php echo escape($row["lastname"]); ?></td>
<td><?php echo escape($row["email"]); ?></td>
<td><?php echo escape($row["age"]); ?></td>
<td><?php echo escape($row["location"]); ?></td>
<td><?php echo escape($row["date"]); ?> </td>
<td><a href="delete.php?id=<?php echo escape($row["id"]);
?>">Delete</a></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
De multe ori, într-o aplicație reală, datele nu vor fi șterse definitiv din baza de date. Utilizatorul poate avea un
camp in tabel de tip boolean care definește utilizatorii „activi“ sau „inactivi“ suplinind de fapt, ștergerea datelor.
Cu toate acestea, DELETE este important să se știe, și poate fi utilizat împreună cu SELECT pentru a șterge si a
introduce date noi, decât sa se modifice cu UPDATE.
Tema de lucru in clasa: Adaugarea unui camp boolean in baza de date care memoreaza daca un utilizator
este sters sau nu si modificarea codului astfel incat stergerea efectiva a unui utilizator sa nu se efectueze ci
modificarea acestui camp.
- Vertraulich / Confidential -
Pasul 2: Adaugare protectie CSRF
Ca un ultim pas, vrem să ia în considerare securitatea. Vom genera un token-uri CSRF și il vom adăuga la sesiunea
utilizatorului.
CSRF este o prescurtare pentru Cross-Site Request Forgery si este o modalitate prin care un atacator poate
pacali un browser prin executarea unei actiuni rau intentionate. ( mai multe informatii despre CSRF gasiti aici:
https://www.incapsula.com/web-application-security/csrf-cross-site-request-forgery.html )
Pentru a preveni acest lucru, vom testa token-ul CSRF în sesiune, față de o valoare într-o intrare ascunsă. În cazul
în care se potrivesc, codul se va executa. Dacă nu se potrivesc, codul va ieși.
Pentru a face acest lucru, vom merge înapoi la common.php, generam CSRF și il atribuim
$_SESSION[„CSRF].
session_start();
if (empty($_SESSION['csrf'])) {
if (function_exists('random_bytes')) {
$_SESSION['csrf'] = bin2hex(random_bytes(32));
} else if (function_exists('mcrypt_create_iv')) {
$_SESSION['csrf'] = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
} else {
$_SESSION['csrf'] = bin2hex(openssl_random_pseudo_bytes(32));
}
}
Acum la inceputul fiecarui fisier din directorul „public“ vom adauga urmatorul cod:
require "../config.php";
require "../common.php";
if (isset($_POST['submit'])) {
if (!hash_equals($_SESSION['csrf'], $_POST['csrf'])) die();
- Vertraulich / Confidential -