Bezpečnostní funkce PHP: strip_tags, filter_var, Md5 a sha1
⚡ Chytré shrnutí
Zabezpečení v PHP chrání webové aplikace před útočníky a neopatrným vstupem ověřováním, sanitizací a bezpečným ukládáním dat. Tento návod se zabývá hlavními hrozbami a poté ukazuje strip_tags, filter_var a esca.pinga moderní hashování hesel s password_hash pro ochranu před XSS, SQL injection a odcizením přihlašovacích údajů.

Potenciální bezpečnostní hrozby
V zásadě existují dvě skupiny lidí, kteří mohou napadnout váš systém:
- Hackeři – se záměrem získat přístup k neoprávněným datům nebo narušit aplikaci
- Uživatelé – mohou neúmyslně zadat do formulářů nesprávné parametry, což může mít negativní dopad na webovou stránku nebo webovou aplikaci.
Následují druhy útoků, na které si musíme dávat pozor.
SQL Injection – tento typ útoku přidává škodlivý kód k SQL prohlášení.
To se provádí buď pomocí formulářů pro vstup uživatele, nebo URLkteré používají proměnné.
Připojený kód zakomentuje podmínku v klauzuli WHERE příkazu SQL. Připojený kód může také:
- vložte podmínku, která bude vždy pravdivá
- odstranit data z tabulky
- aktualizovat data v tabulce
Tento typ útoku se obvykle používá k získání neoprávněného přístupu k aplikaci.
Skriptování mezi weby (XSS) – tento typ útoku vkládá škodlivý kód, obvykle JavaSkript. To se provádí pomocí formulářů pro vstup uživatelů, jako jsou kontaktní formuláře a formuláře pro komentáře. Dělá se to za účelem:
- Získat citlivé informace jako např data souborů cookie
- Přesměrovat uživatele na jinou stránku URL.
Mezi další hrozby může patřit vkládání PHP kódu, vkládání shellu, vkládání e-mailů a odhalení zdrojového kódu skriptu.
Doporučené postupy zabezpečení aplikací PHP
Pojďme se nyní podívat na některé osvědčené postupy zabezpečení PHP, které musíme zvážit při vývojiping naše aplikace.
PHP strip_tags
Funkce strip_tags odstraňuje HTML, JavaScénář, nebo PHP tagy z řetězce.
Tato funkce je užitečná, když potřebujeme chránit naši aplikaci před útoky, jako je například cross-site scripting.
Uvažujme aplikaci, která přijímá komentáře od uživatelů.
<?php $user_input = "Your site rocks"; echo "<h4>My Commenting System</h4>"; echo $user_input; ?>
Za předpokladu, že jste uložili soubor comments.php do složky phptuts, přejděte do složky URL http://localhost/phptuts/comments.php
Předpokládejme, že jako uživatelský vstup obdržíte následující: alert(‘Your site sucks!’);
<?php $user_input = "<script>alert(0);</script>"; echo "<h4>My Commenting System</h4>"; echo $user_input; ?>
Přejděte na URL http://localhost/phptuts/comments.php
Nyní si zabezpečme naši aplikaci před takovými útoky pomocí funkce strip_tags.
<?php $user_input = "<script>alert(0);</script>"; echo strip_tags($user_input); ?>
Přejděte na URL http://localhost/phptuts/comments.php
PHP funkce filter_var
Funkce filter_var se používá k ověření a dezinfekci dat.
Validace kontroluje, zda jsou data správného typu. Číselná kontrola ověření na řetězci vrátí falešný výsledek.
Sanitace odstraňuje nelegální znaky z a šňůra.
Úplnou referenci naleznete na tomto odkazu: filtr_var
Následující kód je určen pro systém komentářů. Používá funkci filter_var a konstantu FILTER_SANITIZE_STRIPPED k odstranění tagů.
<?php $user_input = "<script>alert(0);</script>"; echo filter_var($user_input, FILTER_SANITIZE_STRIPPED); ?>
Výstup:
alert('Your site sucks!');
Poznámka: Funkce FILTER_SANITIZE_STRIPPED (alias funkce FILTER_SANITIZE_STRING) je od verze PHP 8.1 zastaralá. Pro nový kód použijte strip_tags() nebo pro bezpečné zobrazení htmlspecialchars().
PHP mysqli_real_escape_string
Funkce mysqli_real_escape_string se používá k ochraně aplikace před SQL injection.
Předpokládejme, že máme následující SQL příkaz pro ověření uživatelského jména a hesla.
<?php SELECT uid,pwd,role FROM users WHERE uid = 'admin' AND password = 'pass'; ?>
Zlomyslný uživatel může vstoupit ' NEBO 1 = 1 — do textového pole pro uživatelské jméno a 1234 do textového pole pro heslo. Napišme si kód pro ověřovací modul.
<?php $uid = "0$uid1$pwd';"; echo $sql; ?>
Konečný výsledek bude:
SELECT uid,pwd,role FROM users WHERE uid = '' OR 1 = 1 -- ' AND password = '1234';
TADY,
- „WHERE uid = ”“ testuje prázdné uživatelské ID
- „' NEBO 1 = 1“ je podmínka, která bude vždy pravdivá
- „–“ zakomentuje část, která testuje heslo.
Výše uvedený dotaz vrátí všechny uživatele. Nyní použijeme funkci mysqli_real_escape_string k zabezpečení našeho přihlašovacího modulu. V reálném kódu tato funkce bere jako svůj první argument připojení k databázi.
<?php $uid = mysqli_real_escape_string($conn, "0$uid1$pwd';"; echo $sql; ?>
Výše uvedený kód vypíše:
SELECT uid,pwd,role FROM users WHERE uid = '\' OR 1 = 1 -- ' AND password = '1234';
Poznámka: Druhá jednoduchá uvozovka byla escapována, takže bude považována za součást uživatelského jména a heslo nebude zakomentováno.
Nejlepší praxe: uniknoutping pomáhá, ale parametrizované připravené příkazy v mysqli nebo PDO jsou doporučenou obranou proti SQL injection, protože data se nikdy nepřimíchají do textu dotazu.
PHP Md5 a PHP sha1
MD5 je zkratka pro Message Digest 5 a SHA1 je zkratka pro Secure Hash Algorithm 1. Obě se jedná o jednosměrné hašovací funkce.
Níže uvedený kód ukazuje implementaci md5 a sha1.
<?php echo "MD5 Hash: " . md5("password"); echo "SHA1 Hash: " . sha1("password"); ?>
Za předpokladu, že jste uložili soubor hashes.php do složky phptuts, přejděte do URL.
důležité: MD5 a SHA1 jsou rychlé, nesolené hashovací algoritmy a jsou již není považováno za bezpečné pro ukládání hesel, protože je lze rychle prolomit pomocí moderního hardwaru a duhových tabulek. Používejte je pouze pro nezabezpečené kontrolní součty a pro hesla použijte níže uvedenou metodu.
Jak bezpečně hašovat hesla v PHP
Pro ukládání hesel nabízí PHP metody password_hash a password_verify. Tyto metody používají pomalý algoritmus se solenými hodnotami (ve výchozím nastavení bcrypt), takže každý hash je jedinečný a jeho prolomení je drahé, i když je vaše databáze 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"; } ?>
- password_hash() generuje solený hash pro uložení do databáze; PASSWORD_DEFAULT vás udržuje na aktuálním doporučeném algoritmu.
- ověření_hesla() porovná pokus o přihlášení s uloženým hašem, aniž by jej dešifroval.
Protože sůl a algoritmus jsou uloženy uvnitř hashe, nikdy je nespravujete sami, což z něj činí správný a do budoucna připravený způsob, jak zacházet s hesly v PHP.




