Funcția de securitate PHP: strip_tags, filter_var, Md5 și sha1
⚡ Rezumat inteligent
Securitatea PHP protejează aplicațiile web de atacatori și de datele introduse neglijent prin validarea, igienizarea și stocarea în siguranță a datelor. Această prezentare prezintă principalele amenințări, apoi prezintă strip_tags, filter_var, esca.pingși hashing modern al parolelor cu password_hash pentru a se apăra împotriva XSS, injecției SQL și a furtului de acreditări.

Potențiale amenințări de securitate
Există practic două grupuri de persoane care vă pot ataca sistemul:
- Hackeri – cu intenția de a obține acces la date neautorizate sau de a întrerupe aplicația
- Utilizatori – aceștia pot introduce în mod inocent parametri greșiți în formulare, ceea ce poate avea efecte negative asupra unui site web sau a unei aplicații web.
Următoarele sunt tipurile de atacuri la care trebuie să fim atenți.
Injecție SQL – acest tip de atac adaugă cod dăunător la SQL declarații.
Acest lucru se face fie folosind formulare de introducere a datelor de către utilizator, fie URLcare utilizează variabile.
Codul adăugat comentează condiția din clauza WHERE a unei instrucțiuni SQL. Codul adăugat poate, de asemenea:
- introduceți o condiție care va fi întotdeauna adevărată
- ștergeți datele dintr-un tabel
- actualizați datele dintr-un tabel
Acest tip de atac este de obicei folosit pentru a obține acces neautorizat la o aplicație.
Cross-site scripting (XSS) – acest tip de atac introduce cod dăunător, de obicei JavaScript. Acest lucru se realizează folosind formulare de introducere a datelor de către utilizator, cum ar fi formularele de contact și de comentarii. Acest lucru se face pentru:
- Preluați informații sensibile, cum ar fi date cookie
- Redirecționează utilizatorul către o altă URL.
Alte amenințări pot include injecția de cod PHP, injecția de shell, injecția de e-mailuri și divulgarea codului sursă al scriptului.
Cele mai bune practici de securitate a aplicațiilor PHP
Să analizăm acum câteva dintre cele mai bune practici de securitate PHP pe care trebuie să le luăm în considerare atunci când dezvoltămping aplicațiile noastre.
PHP strip_tags
Funcția strip_tags elimină codul HTML, JavaScenariusau etichete PHP dintr-un șir de caractere.
Această funcție este utilă atunci când trebuie să ne protejăm aplicația împotriva atacurilor precum cross-site scripting.
Să luăm în considerare o aplicație care acceptă comentarii de la utilizatori.
<?php $user_input = "Your site rocks"; echo "<h4>My Commenting System</h4>"; echo $user_input; ?>
Presupunând că ați salvat fișierul comments.php în folderul phptuts, navigați la URL http://localhost/phptuts/comments.php
Să presupunem că primiți următoarele date de intrare din partea utilizatorului: alert(‘Your site sucks!’);
<?php $user_input = "<script>alert(0);</script>"; echo "<h4>My Commenting System</h4>"; echo $user_input; ?>
Navigați la URL http://localhost/phptuts/comments.php
Să ne protejăm acum aplicația împotriva unor astfel de atacuri folosind funcția strip_tags.
<?php $user_input = "<script>alert(0);</script>"; echo strip_tags($user_input); ?>
Navigați la URL http://localhost/phptuts/comments.php
Funcția PHP filter_var
Funcția filter_var este utilizată pentru a valida și igieniza datele.
Validarea verifică dacă datele sunt de tipul corect. O verificare de validare numerică a unui șir returnează un rezultat fals.
Igienizarea înseamnă eliminarea caracterelor ilegale din a şir.
Verificați acest link pentru referința completă: filter_var
Codul de mai jos este pentru sistemul de comentarii. Acesta folosește funcția filter_var și constanta FILTER_SANITIZE_STRIPPED pentru a elimina etichetele.
<?php $user_input = "<script>alert(0);</script>"; echo filter_var($user_input, FILTER_SANITIZE_STRIPPED); ?>
ieșire:
alert('Your site sucks!');
Notă: FILTER_SANITIZE_STRIPPED (un alias al FILTER_SANITIZE_STRING) este depreciat începând cu PHP 8.1. Pentru cod nou, utilizați strip_tags() sau, pentru afișare sigură, htmlspecialchars().
PHP mysql_real_escape_string
Funcția mysql_real_escape_string este utilizată pentru a proteja o aplicație împotriva injecțiilor SQL.
Să presupunem că avem următoarea instrucțiune SQL pentru validarea ID-ului de utilizator și a parolei.
<?php SELECT uid,pwd,role FROM users WHERE uid = 'admin' AND password = 'pass'; ?>
Un utilizator rău intenționat poate intra ' SAU 1 = 1 — în caseta de text pentru ID-ul utilizatorului și 1234 în caseta de text pentru parolă. Să codăm modulul de autentificare.
<?php $uid = "0$uid1$pwd';"; echo $sql; ?>
Rezultatul final va fi:
SELECT uid,pwd,role FROM users WHERE uid = '' OR 1 = 1 -- ' AND password = '1234';
AICI,
- „WHERE uid = ”” testează pentru un ID de utilizator gol
- „SAU 1 = 1” este o condiție care va fi întotdeauna adevărată
- „–” comentează partea care testează parola.
Interogarea de mai sus va returna toți utilizatorii. Să folosim acum funcția mysqli_real_escape_string pentru a securiza modulul nostru de autentificare. Rețineți că în codul real această funcție primește conexiunea la baza de date ca prim argument.
<?php $uid = mysqli_real_escape_string($conn, "0$uid1$pwd';"; echo $sql; ?>
Codul de mai sus va afișa:
SELECT uid,pwd,role FROM users WHERE uid = '\' OR 1 = 1 -- ' AND password = '1234';
Notă: a doua apostrofă simplă a fost inclusă în caracterul escape, deci va fi tratată ca parte a ID-ului de utilizator, iar parola nu va fi comentată.
Cea mai buna practica: ESCAping ajută, dar instrucțiunile pregătite parametrizate în MySQL sau PDO sunt apărarea recomandată împotriva injecției SQL, deoarece datele nu sunt niciodată amestecate în textul interogării.
PHP Md5 și PHP sha1
MD5 este acronimul pentru Message Digest 5, iar SHA1 este acronimul pentru Secure Hash Algorithm 1. Ambele sunt funcții de hashing unidirecționale.
Codul de mai jos arată implementarea md5 și sha1.
<?php echo "MD5 Hash: " . md5("password"); echo "SHA1 Hash: " . sha1("password"); ?>
Presupunând că ați salvat fișierul hashes.php în folderul phptuts, navigați la URL.
Important: MD5 și SHA1 sunt hash-uri rapide, nesărate și sunt nu mai este considerat sigur pentru stocarea parolelor, deoarece pot fi sparte rapid cu hardware modern și tabele Rainbow. Folosiți-le doar pentru sume de control care nu au legătură cu securitatea și folosiți metoda de mai jos pentru parole.
Cum să criptezi parolele în mod securizat în PHP
Pentru stocarea parolelor, PHP oferă password_hash și password_verify. Acestea aplică un algoritm lent, cu valori sărate (bcrypt în mod implicit), astfel încât fiecare hash este unic și costisitor de spart, chiar dacă baza de date este furată.
<?php // Hash a password before storing it in the database $hash = password_hash("mypassword", PASSWORD_DEFAULT); // Verify the password when the user logs in if (password_verify("mypassword", $hash)) { echo "Password is valid"; } else { echo "Invalid password"; } ?>
- password_hash() generează un hash sărat pentru stocarea în baza de date; PASSWORD_DEFAULT vă menține pe algoritmul recomandat curent.
- verificare_parolă() verifică o încercare de autentificare în raport cu hash-ul stocat fără a-l decripta vreodată.
Deoarece sarea și algoritmul sunt stocate în hash, nu le gestionați niciodată singur, ceea ce face ca aceasta să fie modalitatea corectă și pregătită pentru viitor de a gestiona parolele în PHP.




