Sunteți pe pagina 1din 4

Workshop3.

Crearea mediului de lucru si conectarea MySQL cu PHP (partea a 3-a:


Delete si Adaugare protectie CSRF)

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:

- Cunostinte minime de HTML

- Cunostinte minime de PHP

- Un mediu local PHP+MySQL ( XAMPP )

- Codul aplicatiei create in Worksohop-urile anterioare

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

Pasul 1: Pregatirea mediului de lucru

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.

Pasul 1: Stergerea unei inregistrari din baza de date

Ne intoarcem la index.php si adaugam o noua intrare pentru “delete“

<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.

<td><a href="delete.php?id=<?php echo escape($row["id"]); ?>">Delete</a></td>

Acesta este codul din delete.php


<?php

- 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"];

$sql = "DELETE FROM users WHERE id = :id";

$statement = $connection->prepare($sql);
$statement->bindValue(':id', $id);
$statement->execute();

$success = "User successfully deleted";


} catch(PDOException $error) {
echo $sql . "<br>" . $error->getMessage();
}
}

try {
$connection = new PDO($dsn, $username, $password, $options);

$sql = "SELECT * FROM users";

$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>

<?php if ($success) echo $success; ?>

<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>

<a href="index.php">Back to home</a>

<?php require "templates/footer.php"; ?>

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();

In final vom adauga valoarea intru-un input ascuns in fiecare formular:

<input name="csrf" type="hidden" value="<?php echo escape($_SESSION['csrf']); ?>">

- Vertraulich / Confidential -