Validarea Formularelor

PHP | Stefanescu Mihai | 2020-10-11

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

 



Imi place ce faci aici
Daca iti place ce fac aici imi poti cumpara o cafea Buy Me a Coffee at ko-fi.com

Stefanescu Mihai
Programator de ~8 ani, am lucrat la proiecte din mai multe industrstrii, de la eCommerce la telecomunicatii la automatizari. In acest timp am folosi diferite tehnologii, de la PHP, MySQL, PostgreSql, RabbitMq, Redis, Memcached si altele.
       

Get in touch
Pentru nelamuriri, dubii, comentarii si chestii de pe suflet ne putem auzi pe Discord, Reddit sau poti deschide o discutie noua pe forum.

Posteaza un comentariu

Comentarii

Inca nu au fost postate comentarii, fii primul care posteaza un comentariu!

Club-ul este dedicat membrilor si ofera access la mai multe zone ale website-ului.

🗝ïļ Login 🌟 Register

🔖 Bookmarks ⊞
âœĻ Pentru a sustine aceasta comunitate am sa te rog sa te autentifici sau sa te inregistrezi!

🌊ïļ Discord ⊞

Folosim cookie-uri pentru a oferi functionalitatile critice ale aplicatiei Invata-Programare. Folosim cookie-uri si pentru a analiza traficul, pentru care e nevoie de consimtamantul dvs. explicit.

⮆ïļ