PHP-sikkerhedsfunktion: strip_tags, filter_var, Md5 og sha1
⚡ Smart opsummering
PHP Security beskytter webapplikationer mod angribere og uforsigtig input ved at validere, rense og lagre data sikkert. Denne gennemgang dækker de vigtigste trusler og viser derefter strip_tags, filter_var og esca.pingog moderne adgangskode-hashing med password_hash for at forsvare mod XSS, SQL-injektion og stjålne legitimationsoplysninger.

Potentielle sikkerhedstrusler
Der er grundlæggende to grupper af mennesker, der kan angribe dit system:
- Hackere – med den hensigt at få adgang til uautoriserede data eller forstyrre applikationen
- Brugere – de kan uskyldigt indtaste forkerte parametre i formularer, hvilket kan have negative effekter på et websted eller en webapplikation.
Følgende er den slags angreb, som vi skal holde øje med.
SQL Injection – denne type angreb tilføjer skadelig kode til SQL udsagn.
Dette gøres enten ved hjælp af brugerinputformularer eller URLs, der bruger variabler.
Den tilføjede kode kommenterer betingelsen i WHERE-klausulen i en SQL-sætning. Den tilføjede kode kan også:
- indsæt en betingelse, der altid vil være sand
- slette data fra en tabel
- opdatere data i en tabel
Denne type angreb bruges normalt til at få uautoriseret adgang til en applikation.
Cross-site scripting (XSS) – denne type angreb indsætter skadelig kode, normalt JavaScript. Dette gøres ved hjælp af brugerinputformularer såsom kontaktformularer og kommentarformularer. Dette gøres for at:
- Hent følsomme oplysninger som f.eks cookiedata
- Omdiriger brugeren til en anden URL.
Andre trusler kan omfatte PHP-kodeinjektion, shell-injektion, e-mail-injektion og afsløring af scriptkildekode.
PHP Application Security Bedste Practices
Lad os nu se på nogle af de bedste praksisser inden for PHP-sikkerhed, som vi skal overveje, når vi udviklerping vores applikationer.
PHP strip_tags
Funktionen strip_tags fjerner HTML, JavaScripteller PHP-tags fra en streng.
Denne funktion er nyttig, når vi skal beskytte vores applikation mod angreb som f.eks. cross-site scripting.
Lad os se på en applikation, der accepterer kommentarer fra brugere.
<?php $user_input = "Your site rocks"; echo "<h4>My Commenting System</h4>"; echo $user_input; ?>
Hvis du har gemt comments.php i phptuts-mappen, skal du gå til URL http://localhost/phptuts/comments.php
Lad os antage, at du modtager følgende som brugerinput: alert(‘Your site sucks!’);
<?php $user_input = "<script>alert(0);</script>"; echo "<h4>My Commenting System</h4>"; echo $user_input; ?>
Gå til URL http://localhost/phptuts/comments.php
Lad os nu sikre vores applikation mod sådanne angreb ved hjælp af strip_tags-funktionen.
<?php $user_input = "<script>alert(0);</script>"; echo strip_tags($user_input); ?>
Gå til URL http://localhost/phptuts/comments.php
PHP filter_var funktion
Filter_var-funktionen bruges til at validere og rense data.
Validering kontrollerer, om dataene er af den rigtige type. Et numerisk valideringstjek på en streng returnerer et falsk resultat.
Sanering er at fjerne ulovlige tegn fra en streng.
Tjek dette link for den komplette reference: filter_var
Koden nedenfor er til kommentarsystemet. Det bruger filter_var-funktionen og FILTER_SANITIZE_STRIPPED-konstanten til at fjerne tags.
<?php $user_input = "<script>alert(0);</script>"; echo filter_var($user_input, FILTER_SANITIZE_STRIPPED); ?>
Output:
alert('Your site sucks!');
Bemærk: FILTER_SANITIZE_STRIPPED (et alias for FILTER_SANITIZE_STRING) er udfaset fra PHP 8.1. Brug strip_tags() eller htmlspecialchars() for sikker visning til ny kode.
PHP mysqli_real_escape_string
Funktionen mysqli_real_escape_string bruges til at beskytte et program mod SQL-injektion.
Lad os antage, at vi har følgende SQL-sætning til validering af bruger-id og adgangskode.
<?php SELECT uid,pwd,role FROM users WHERE uid = 'admin' AND password = 'pass'; ?>
En ondsindet bruger kan komme ind 'ELLER 1 = 1 — i tekstfeltet bruger-id og 1234 i tekstfeltet adgangskode. Lad os kode godkendelsesmodulet.
<?php $uid = "0$uid1$pwd';"; echo $sql; ?>
Slutresultatet bliver:
SELECT uid,pwd,role FROM users WHERE uid = '' OR 1 = 1 -- ' AND password = '1234';
HER,
- "WHERE uid = "" tester for et tomt bruger-id
- "'ELLER 1 = 1" er en betingelse, der altid vil være sand
- "–" kommenterer den del, der tester for adgangskoden.
Ovenstående forespørgsel returnerer alle brugerne. Lad os nu bruge funktionen mysqli_real_escape_string til at sikre vores login-modul. Bemærk, at i den virkelige kode tager denne funktion databaseforbindelsen som sit første argument.
<?php $uid = mysqli_real_escape_string($conn, "0$uid1$pwd';"; echo $sql; ?>
Ovenstående kode vil udskrive:
SELECT uid,pwd,role FROM users WHERE uid = '\' OR 1 = 1 -- ' AND password = '1234';
Bemærk: Det andet enkelte anførselstegn er blevet escapet, så det vil blive behandlet som en del af bruger-id'et, og adgangskoden vil ikke blive kommenteret ud.
Bedste praksis: escaping hjælper, men parametriserede forberedte sætninger i mysqli eller PDO er det anbefalede forsvar mod SQL-injektion, fordi dataene aldrig blandes i forespørgselsteksten.
PHP Md5 og PHP sha1
MD5 er akronymet for Message Digest 5, og SHA1 er akronymet for Secure Hash Algorithm 1. Begge er envejs hashingfunktioner.
Koden nedenfor viser implementeringen af md5 og sha1.
<?php echo "MD5 Hash: " . md5("password"); echo "SHA1 Hash: " . sha1("password"); ?>
Hvis du har gemt filen hashes.php i mappen phptuts, skal du gå til URL.
Vigtig: MD5 og SHA1 er hurtige, usaltede hashes og er betragtes ikke længere som sikkert at opbevare adgangskoder med, fordi de hurtigt kan knækkes med moderne hardware og regnbuetabeller. Brug dem kun til ikke-sikkerhedsrelaterede checksummer, og brug metoden nedenfor til adgangskoder.
Sådan hasher du adgangskoder sikkert i PHP
Til lagring af adgangskoder tilbyder PHP password_hash og password_verify. Disse anvender en langsom, saltet algoritme (bcrypt som standard), så hver hash er unik og dyr at knække, selvom din database bliver stjålet.
<?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() genererer en saltet hash, der skal gemmes i databasen; PASSWORD_DEFAULT holder dig på den aktuelt anbefalede algoritme.
- password_verify() tjekker et loginforsøg mod den lagrede hash uden nogensinde at dekryptere den.
Fordi salt og algoritme er gemt inde i hashen, administrerer du dem aldrig selv, hvilket gør dette til den korrekte og fremtidssikrede måde at håndtere adgangskoder i PHP.




