Validarea Formularelor

postat acum 4 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!

Comentariu postate de caterpillar shoes la data de 15.05.2019
I really wanted to jot down a message so as to express gratitude to you for some of the fantastic strategies you are showing on this site. My rather long internet search has at the end of the day been paid with good know-how to go over with my friends and classmates. I 'd mention that we visitors actually are rather blessed to dwell in a superb site with very many special professionals with valuable tips. I feel really fortunate to have encountered the weblog and look forward to many more brilliant times reading here. Thanks a lot once again for everything.
Comentariu postate de minecraft download for free la data de 15.05.2019
Great blog here! Also your site loads up very fast! What web host are you using? Can I get your affiliate link to your host? I wish my site loaded up as fast as yours lol
Comentariu postate de how to download minecraft free la data de 16.05.2019
I'm curious to find out what blog system you are utilizing? I'm experiencing some minor security issues with my latest blog and I'd like to find something more secure. Do you have any recommendations?
Comentariu postate de minecraft free download pc la data de 17.05.2019
Highly descriptive article, I liked that a lot. Will there be a part 2?