Aktuālā situācija: PHP2Shell. Divas kritiskas PHP ievainojamības (CVSS 9.2) ļauj izpildīt ļaunprātīgu kodu bez pieteikšanās. Ielāpi kopš 21.10.2026.Kas jādara tagad →

PHP iebūvētās drošības funkcijas

PHP piedāvā drošus pamatelementus parolēm, nejaušām vērtībām, maskēšanai, kriptogrāfijai un sesijām. Kas tos konsekventi lieto, izvairās no biežākajām lietojumprogrammu kļūdām.

Aktuāls uz 4 min lasīšanas laiksPHP zināšanas

Īsi: PHP biežākajiem drošības uzdevumiem piedāvā gatavas, pārbaudītas funkcijas: password_hash() parolēm, random_bytes() un random_int() tokeniem, htmlspecialchars() pret Cross-Site Scripting, sagatavotus vaicājumus ar PDO pret SQL injekciju, hash_equals() drošai salīdzināšanai un Sodium paplašinājumu kriptogrāfijai. Kas šos pamatelementus konsekventi lieto, izvairās no lielākās daļas lietojumprogrammu ievainojamību. Pret kļūdām pašā PHP interpretatorā, kā PHP2Shell gadījumā, tie nepalīdz; tur palīdz tikai atjauninājums.

Kāpēc iebūvētas PHP drošības funkcijas?

Drošības kodu rakstīt pašam ir kļūdaini. Pašrakstīta paroles jaucējfunkcija, paša būvēts tokenu ģenerators vai paša sakārtots HTML izvades filtrs bieži izskatās pareizi, bet tāds nav. Iebūvētās funkcijas ir dokumentētas, pārbaudītas un tiek uzturētas ar PHP atjauninājumiem.

Lēmumu pieņēmējiem tas nozīmē: jautājiet savai aģentūrai vai izstrādes komandai nevis, vai drošības funkcijas ir būvētas pašu spēkiem, bet gan vai tiek lietotas valodas standarta funkcijas. Tabula sniedz pārskatu.

Uzdevums Funkcija Pieejama kopš Svarīga norāde
Paroļu glabāšana password_hash(), password_verify() PHP 5.5 kolonna līdz 255 rakstzīmēm; bcrypt saīsina līdz 72 baitiem
Nejauši tokeni random_bytes(), random_int() PHP 7.0 nekad rand() vai mt_rand() noslēpumiem
Nejaušība objektorientēti Random\Randomizer PHP 8.2 tāda pati drošība, elastīgāka saskarne
HTML izvades maskēšana htmlspecialchars() kopš seniem laikiem noklusējuma karodziņi kopš 8.1 maskē arī vienpēdiņas
Salīdzināšana nemainīgā laikā hash_equals() PHP 5.6 lietotāja ievade kā otrais arguments
Moderna kriptogrāfija Sodium (sodium_*) PHP 7.2 paša šifrēšanas vietā
Noslēpumi steka izsekojumos #[\SensitiveParameter] PHP 8.2 vērtība neparādās izsekojumā
Ievades pārbaude filter_var() PHP 5.2 pārbauda formātu, neaizstāj maskēšanu

Paroles un tokeni

password_hash() izveido sālītu jaucējkodu, password_verify() to pārbauda. Ar PASSWORD_DEFAULT PHP pašlaik izmanto bcrypt; kopš PHP 8.4 noklusējuma izmaksu faktors saskaņā ar rokasgrāmatu ir 12, nevis 10. Tā kā noklusējuma algoritms var mainīties, rokasgrāmata iesaka datubāzes kolonnu ar 255 rakstzīmēm. Bcrypt gadījumā paroles tiek nogrieztas pēc 72 baitiem, kas jāņem vērā ļoti garām paroles frāzēm.

<?php
// Reģistrācija
$hash = password_hash($passwort, PASSWORD_DEFAULT);

// Pieteikšanās, ieskaitot veco jaucējkodu automātisku uzlabošanu
if (password_verify($eingabe, $hash)) {
    if (password_needs_rehash($hash, PASSWORD_DEFAULT)) {
        $hash = password_hash($eingabe, PASSWORD_DEFAULT); // saglabāt no jauna
    }
}

// Tokens saitei paroles atiestatīšanai
$token = bin2hex(random_bytes(32));

Noslēpumu salīdzināšanai, piemēram, paraksta, jālieto hash_equals(). Parasts salīdzinājums ar === saskaņā ar rokasgrāmatu pēc izpildes laika var atklāt, no kuras vietas divas vērtības atšķiras. Plašāk: Paroļu droša glabāšana PHP un droši nejauši skaitļi un tokeni.

Izvades maskēšana un droši datubāzes vaicājumi

Cross-Site Scripting rodas, kad lietotāja ievade nefiltrēta nonāk HTML. htmlspecialchars() speciālās rakstzīmes pārvērš HTML entītijās. Kopš PHP 8.1 noklusējuma karodziņi ir ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401; agrāk vienpēdiņas netika pārveidotas. Kam jāatbalsta vecākas versijas, tas karodziņus norāda skaidri.

SQL injekciju novērš sagatavoti vaicājumi. Vērtības tiek pārraidītas atsevišķi no SQL teksta un vaicājumu mainīt nevar:

<?php
$stmt = $pdo->prepare('SELECT id, name FROM kunden WHERE email = :email');
$stmt->execute(['email' => $email]);
$kunde = $stmt->fetch();

echo htmlspecialchars($kunde['name'] ?? '', ENT_QUOTES, 'UTF-8');

Detaļas ir sadaļā Cross-Site Scripting novēršana PHP un SQL injekcijas lapā.

Ievades pārbaude ir otrs, atsevišķs solis. filter_var() nosaka, vai vērtībai ir derīgs formāts, piemēram, e-pasta adrese vai vesels skaitlis atļautā diapazonā. Taču tas neaizstāj maskēšanu izvadē un sagatavotu vaicājumu, jo arī formāli derīgas vērtības var saturēt speciālās rakstzīmes.

Noslēpumu turēšana prom no kļūdu ziņojumiem

Par maz novērtēta datu noplūde ir steka izsekojumi. Ja funkcijā rodas kļūda, PHP reģistrē izsaukumu ķēdi kopā ar argumentiem. Ja tajā ir parole vai API atslēga, tā nonāk žurnālā. Kopš PHP 8.2 atribūts #[\SensitiveParameter] šādus parametrus atzīmē; to vērtība izsekojumā tad parādās tikai kā objekts SensitiveParameterValue.

<?php
function anmelden(string $benutzer, #[\SensitiveParameter] string $passwort): bool
{
    // ... pārbaude ...
    throw new RuntimeException('Datenbank nicht erreichbar');
}

Saskaņā ar norādi rokasgrāmatā atribūts darbojas tikai konkrētajā implementācijā, nevis interfeisa metodē. Tāpēc iestatiet to tur, kur kods patiešām darbojas.

Sesijas: droši iestatījumi un jauni noklusējumi

Sesijas ir bieži uzbrukuma mērķis. Trīs iestatījumi ir centrāli: session.use_strict_mode=1 noraida sesiju ID, ko serveris pats nav izveidojis; session.cookie_httponly=1 neļauj ar JavaScript piekļūt sesijas sīkdatnei; session.cookie_samesite=Lax apgrūtina nosūtīšanu līdzi no svešām lapām. Saskaņā ar pieņemto RFC tieši šīs trīs vērtības ar PHP 8.6 kļūs par noklusējumu. Līdz tam iestatiet tās pats, un arī pēc tam skaidri, lai konfigurācija nebūtu atkarīga no noklusējuma.

session.use_strict_mode = 1
session.cookie_httponly = 1
session.cookie_samesite = Lax
session.cookie_secure = 1

Vairāk sadaļā Sesiju nodrošināšana PHP.

Ko iebūvētās funkcijas nedara

PHP projekts savā drošības politikā ir skaidrs: PHP nav smilškaste (sandbox). open_basedir vai disable_functions apiešana, ļaunprātīga ievade unserialize() un nepārbaudīti argumenti funkcijām, piemēram, mysqli_query(), netiek uzskatīti par PHP drošības ievainojamībām. Operatoriem tas nozīmē: šie iestatījumi ir noderīga nostiprināšana, bet nav drošības robeža, un unserialize() ar svešiem datiem nav jālieto.

Otrs punkts attiecas uz PHP2Shell. CVE-2026-109618 un CVE-2026-109619 saskaņā ar php.net ļauj izpildīt kodu, pirms vai kamēr darbojas jūsu lietojumprogramma; mod_php gadījumā exploit tika demonstrēts, pirms vispār tiek izpildīts lietojumprogrammas kods. Neviena funkcija jūsu kodā to nevar apturēt. Droša programmēšana un aktuāla PHP versija ir divi atsevišķi pienākumi, un jāizpilda abi.

Kā PHP SOS palīdz konkrēti?

PHP lietojumprogrammu drošības auditā mēs mērķtiecīgi pārbaudām:

  • Paroļu un tokenu apstrāde: vai tiek lietoti password_hash() un random_bytes(), vai ir pašbūvēti risinājumi?
  • Izvades un vaicājumi: kur ievade nefiltrēta nonāk HTML, SQL vai shell komandās?
  • Sesiju konfigurācija: vai Strict Mode, HttpOnly, SameSite un Secure ir iestatīti un nav pārrakstāmi?
  • Izpildes vide: vai darbojas atbalstīta PHP versija ar labojumiem no 21.10.2026?

Biežāk uzdotie jautājumi

Kā PHP pareizi glabāt paroles?

Ar password_hash() un PASSWORD_DEFAULT, pārbauda ar password_verify(). Saskaņā ar rokasgrāmatu datubāzes kolonnai jāiekļauj līdz 255 rakstzīmēm, jo noklusējuma algoritms nākotnē var mainīties.

Vai rand() der tokeniem?

Nē. Tokeniem, atslēgām un paroles atiestatīšanas saitēm jālieto random_bytes() vai random_int(). Saskaņā ar rokasgrāmatu tās dod kriptogrāfiski drošas nejaušas vērtības.

Kopš kura laika Sodium ir PHP sastāvā?

Sodium paplašinājums modernai kriptogrāfijai ir PHP sastāvdaļa kopš PHP 7.2.0. Vecākām versijām to varēja pievienot tikai ar PECL.

Vai šīs funkcijas pasargā no PHP2Shell?

Nē. Tās pasargā no kļūdām jūsu lietojumprogrammā. PHP2Shell atrodas pašā interpretatorā, un to aizver tikai PHP atjauninājums, kam seko visu PHP procesu pārstartēšana.

Vai sesiju noklusējuma iestatījumi PHP 8.6 mainās?

Jā, saskaņā ar pieņemto RFC session.use_strict_mode un session.cookie_httponly pēc noklusējuma tiek ieslēgti un session.cookie_samesite iestatīts uz Lax. Esošās konfigurācijas tomēr vajadzētu iestatīt pašiem skaidri.

Avoti

Tūlītējs kontakts

Katra stunda ir svarīga. Rakstiet mums tūlīt.

Īsi aprakstiet sistēmu, PHP versiju un novēroto. Mēs sazināsimies, noskaidrosim situāciju un strādāsim attālināti, līdz incidents ir slēgts un dokumentēts.

Tūlītēja palīdzība