Sigurnosna funkcija PHP-a: strip_tags, filter_var, Md5 i sha1
⚡ Pametni sažetak
PHP sigurnost štiti web aplikacije od napadača i nepažljivog unosa validacijom, sanitizacijom i sigurnim pohranjivanjem podataka. Ovaj vodič pokriva glavne prijetnje, a zatim prikazuje strip_tags, filter_var, escapingi moderno hashiranje lozinki s password_hash za obranu od XSS-a, SQL injekcije i ukradenih vjerodajnica.
Potencijalne sigurnosne prijetnje
Postoje u osnovi dvije skupine ljudi koje mogu napasti vaš sustav:
- Hakeri – s namjerom da dobiju pristup neovlaštenim podacima ili ometaju aplikaciju
- Korisnici – mogu nenamjerno unijeti pogrešne parametre u obrasce, što može imati negativne učinke na web stranicu ili web aplikaciju.
Sljedeće su vrste napada na koje moramo paziti.
SQL Injection – ova vrsta napada dodaje štetni kod SQL izjave.
To se radi pomoću obrazaca za korisnički unos ili URLkoji koriste varijable.
Dodani kod komentira uvjet u WHERE klauzuli SQL naredbe. Dodani kod također može:
- ubacite uvjet koji će uvijek biti istinit
- izbrisati podatke iz tablice
- ažurirati podatke u tablici
Ova vrsta napada obično se koristi za dobivanje neovlaštenog pristupa aplikaciji.
Skriptiranje između stranica (XSS) – ova vrsta napada ubacuje štetni kod, obično JavaSkripta. To se radi pomoću obrazaca za unos korisnika kao što su kontaktni obrasci i obrasci za komentare. To se radi kako bi se:
- Dohvaćanje osjetljivih informacija kao što su podaci o kolačićima
- Preusmjeri korisnika na drugu URL.
Druge prijetnje mogu uključivati ubrizgavanje PHP koda, ubrizgavanje shell-a, ubrizgavanje e-pošte i otkrivanje izvornog koda skripte.
Najbolji primjeri iz prakse za sigurnost PHP aplikacija
Pogledajmo sada neke od najboljih sigurnosnih praksi u PHP-u koje moramo uzeti u obzir prilikom razvojaping naše aplikacije.
PHP strip_tags
Funkcija strip_tags uklanja HTML, JavaScript, ili PHP oznake iz niza znakova.
Ova funkcija je korisna kada moramo zaštititi našu aplikaciju od napada poput cross-site scriptinga.
Razmotrimo aplikaciju koja prihvaća komentare od korisnika.
<?php $user_input = "Your site rocks"; echo "<h4>My Commenting System</h4>"; echo $user_input; ?>
Pod pretpostavkom da ste spremili datoteku comments.php u mapu phptuts, idite do URL http://localhost/phptuts/comments.php
Pretpostavimo da kao korisnički unos primate sljedeće: alert(‘Your site sucks!’);
<?php $user_input = "<script>alert(0);</script>"; echo "<h4>My Commenting System</h4>"; echo $user_input; ?>
Pregledajte URL http://localhost/phptuts/comments.php
Sada zaštitimo našu aplikaciju od takvih napada pomoću funkcije strip_tags.
<?php $user_input = "<script>alert(0);</script>"; echo strip_tags($user_input); ?>
Pregledajte URL http://localhost/phptuts/comments.php
Funkcija PHP filter_var
Funkcija filter_var koristi se za provjeru valjanosti i čišćenje podataka.
Validacijom se provjerava jesu li podaci ispravne vrste. Numerička provjera valjanosti niza vraća pogrešan rezultat.
Dezinfekcija je uklanjanje ilegalnih znakova iz a niz.
Za potpunu referencu provjerite ovu poveznicu: filter_var
Donji kod je za sustav komentiranja. Koristi funkciju filter_var i konstantu FILTER_SANITIZE_STRIPPED za uklanjanje oznaka.
<?php $user_input = "<script>alert(0);</script>"; echo filter_var($user_input, FILTER_SANITIZE_STRIPPED); ?>
Izlaz:
alert('Your site sucks!');
Bilješka: FILTER_SANITIZE_STRIPPED (pseudonim za FILTER_SANITIZE_STRING) je zastario od verzije PHP 8.1. Za novi kod koristite strip_tags() ili, za siguran prikaz, htmlspecialchars().
PHP mysqli_real_escape_string
Funkcija mysqli_real_escape_string koristi se za zaštitu aplikacije od SQL injekcije.
Pretpostavimo da imamo sljedeću SQL naredbu za provjeru korisničkog imena i lozinke.
<?php SELECT uid,pwd,role FROM users WHERE uid = 'admin' AND password = 'pass'; ?>
Zlonamjerni korisnik može ući ' ILI 1 = 1 — u tekstualnom okviru za korisnički ID i 1234 u tekstualnom okviru za lozinku. Napišimo kod za modul za autentifikaciju.
<?php $uid = "0$uid1$pwd';"; echo $sql; ?>
Konačni rezultat će biti:
SELECT uid,pwd,role FROM users WHERE uid = '' OR 1 = 1 -- ' AND password = '1234';
OVDJE,
- „WHERE uid = ”” provjerava prazan korisnički ID
- „ILI 1 = 1“ je uvjet koji će uvijek biti istinit
- "–" komentira dio koji provjerava lozinku.
Gornji upit će vratiti sve korisnike. Sada ćemo upotrijebiti funkciju mysqli_real_escape_string za osiguranje našeg modula za prijavu. Imajte na umu da u stvarnom kodu ova funkcija uzima vezu s bazom podataka kao svoj prvi argument.
<?php $uid = mysqli_real_escape_string($conn, "0$uid1$pwd';"; echo $sql; ?>
Gornji kod će ispisati:
SELECT uid,pwd,role FROM users WHERE uid = '\' OR 1 = 1 -- ' AND password = '1234';
Napomena: drugi jednostruki navodnik je izbjegnut, pa će se tretirati kao dio korisničkog ID-a, a lozinka neće biti komentirana.
Najbolja vježba: pobjećiping pomaže, ali parametrizirane pripremljene naredbe u mysqliju ili PDO-u su preporučena obrana od SQL injekcije, jer se podaci nikada ne miješaju u tekst upita.
PHP Md5 i PHP sha1
MD5 je kratica za Message Digest 5, a SHA1 je kratica za Secure Hash Algorithm 1. Obje su jednosmjerne funkcije hashiranja.
Donji kod prikazuje implementaciju md5 i sha1.
<?php echo "MD5 Hash: " . md5("password"); echo "SHA1 Hash: " . sha1("password"); ?>
Pod pretpostavkom da ste spremili datoteku hashes.php u mapu phptuts, idite do URL.
Važno: MD5 i SHA1 su brzi, neslani hashevi i više se ne smatra sigurnim za pohranjivanje lozinki, jer se mogu brzo probiti modernim hardverom i rainbow tablicama. Koristite ih samo za kontrolne zbrojeve koji nisu sigurnosni, a za lozinke koristite donju metodu.
Kako sigurno hashirati lozinke u PHP-u
Za pohranu lozinki, PHP nudi password_hash i password_verify. Oni primjenjuju spor, slani algoritam (bcrypt prema zadanim postavkama), tako da je svaki hash jedinstven i skup za probijanje, čak i ako vam je baza podataka ukradena.
<?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"; } ?>
- hash_lozinke() generira slani hash za pohranu u bazu podataka; PASSWORD_DEFAULT vas drži na trenutno preporučenom algoritmu.
- provjera_lozinke() provjerava pokušaj prijave u odnosu na pohranjeni hash bez da ga ikada dešifrira.
Budući da su sol i algoritam pohranjeni unutar hasha, nikada njima sami ne upravljate, što ovo čini ispravnim i sigurnim načinom rukovanja lozinkama u PHP-u.





