Validarea Formularelor

postat acum 2 ani de Stefanescu Mihai in categorie PHP

Primul lucru pe care trebuie sa-l aveti in minte cand procesati formulare in PHP este securitatea.

Avem urmatorul formular:

<form action="<?php  htmlspecialchars($_SERVER['PHP_SELF']) ?>" method="POST">
		Nume: <input type="text" name="nume" />
		Email: <input type="text" name="email" />
		WebSite: <input type="text" name="website" />
		Comentariu: <textarea name='comentariu'></textarea>
		Sexul: <input type='radio' name='sexul' value='m'>Male <input type='radio' name='sexul' value='f'>Female
	<input type="submit" />
</form>

Regulile de validare impuse:

Camp Reguli Validare
Nume Necesar. Trebuie sa contina doar litere si spatii albe.
Email Necesar. Trebuie sa contina o adresa de email valida.
Website Optional. Daca este completat trebuie sa fie un URL valid.
Comentariu Optional. Text.
Sexul Necesar. Trebuie sa fie selectata o valoare

In primul rand hai sa ne uitam la action-ul formularului:

<form action="<?php  htmlspecialchars($_SERVER['PHP_SELF']) ?>" method="POST">

Se observa clar ca am folosit metoda POST, dar probabil va intrebati ce estehtmlspecialcharacters($_SERVER[‘PHP_SELF’]) si de ce l-am folosit.

Hai sa luam componentele pe rand, avem in primul rand variabila $_SEVER[‘PHP_SELF’] care nu face altceva decat sa returneze locatia scriptului curent.

Deci, aceasta variabila ($_SERVER[‘PHP_SELF’]) transmite informatia catre acelasi script in loc sa o transmita catre alta pagina, astfel utilizatorul va primi eroarea (daca exista una) pe aceasi pagina cu formularul.Acum hai sa discutam despre functia htmlspecialcharacters(). Aceasta functie converteste cracterele HTML in entitati. Asta inseamna ca orice caracter precum < sau > va deveni &lt; si &gt;. Asta previne injectarea de cod Javascript (Cross-site Scripting Attack) in  formular.Despre Securitate in PHPVariabila $_SERVER[‘PHP_SELF’] este vulnerabila atacurilor!

Sa presupunem ca avem urmatorul formular pagina php numita test_form.php:

<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

Acum, daca un utilizator introduce urmatorul URL in bara de adrese “http://www.siteulmeu.ro/test_form.php” $_SERVER[‘PHP_SELF’] ne va da urmatorul cod HTML:

<form method="post" action="test_form.php">

Pana aici totul merge foarte bine, dar hai sa ne gandim ce se va intampla daca un utilizator introduce urmatorul cod:

http://www.siteulmeu.ro/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

Acesta va avea urmatorul rezultat:

<form method="post" action="test_form.php/"><script>alert('hacked')</script>

Acest cod injecteaza un cod javscript in site, iar cand pagina este incarcata codul va fi executat. Acesta este este doar un exemplu inofensiv de injectare a codului, dar pornind de la el se poate ajunge la lucruri mai periculoase.

Atentie, orice cod javascript poate fi inserat intre tag-urile <script>, astfel inca un hacker poate redirectiona utilizatorii catre alt server sau poate insera cod mailcios pentru a fura informatiile utiolizatorilor.Cum evitam exploiturile $_SERVER[‘PHP_SELF’]Vulnerabilitatile $_SERVER[“PHP_SELF”] pot fi evitate folosind functia htmlspecialchars().Atunci cand avem un formular de genul:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

Rezultatul va avea urmatoarea forma:

<form method="post" action="test_form.php/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;">

Cod ce nu afecteaza cu nimic scriptul nostru.

Validarea formularului

Primul lucru pe care trebuie sa-l facem este sa trecem informatiile prin prin functia htmlspecialchars() inainte sa le prelucram sau sa le punem in baza de date.

Cand folosim functia htmlspecialcharacters()si un utilizator incearca sa transmita urmatorul cod:

<script>location.href('http://www.siteul_hackerului.ro')</script>

nu va fi executat pentru ca toate caracterele html sunt transformate in entitati:

&lt;script&gt;location.href('http://www.siteul-hackerului.ro')&lt;/script&gt;

Urmatorul pas este sa facem o functie ce va verifica codul (mai simplu decat sa scriem acelasi cod de fiecare data). Hai sa numim aceasta functie testare().

if ($_SERVER["REQUEST_METHOD"] === "POST") {
  $nume = testare($_POST["nume"]);
  $email = testare($_POST["email"]);
  $website = testare($_POST["website"]);
  $comment = testare($_POST["comment"]);
  $sexul = testare($_POST["sexul"]);
}

function testare($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}

 

Sunt un tanar programator din Bucuresti ce lucreaza in PHP/Mysql (MySqli/PDO), Laravel, CodeIgniter, MySQL, PostgreSQL, Wordpress, HTML5/CSS3, Sass, Photoshop si multe altele.
Google+ Community Facebook Group
Acest articol a fost mutat de pe vechea platforma.
Pentru orice eroare aparuta la mutare va rog sa ma contactati!