Sitwazzjoni attwali: PHP2Shell. Żewġ vulnerabbiltajiet kritiċi ta' PHP (CVSS 9,2) jippermettu kodiċi malizzjuż mingħajr login. Patches mill-21/10/2026.X'għandu jsir issa →

Aħżen il-passwords f'PHP b'mod sigur: kif tuża password_hash sewwa

Kif l-iżviluppaturi jaħżnu l-passwords f'PHP b'password_hash u password_verify, jagħżlu l-proċedura adattata u jibdlu hashes qodma ta' MD5 jew SHA-1 mingħajr reset tal-password għall-utenti kollha.

Stat 6 min. qariŻvilupp sigur

Fil-qosor: Il-passwords taħżnuhom f'PHP b'password_hash() u tivverifikawhom b'password_verify(). Il-valur awtomatiku PASSWORD_DEFAULT bħalissa juża bcrypt, minn PHP 8.4 b'fattur tal-ispiża 12; fejn PHP huwa kkumpilat b'Argon2, PASSWORD_ARGON2ID hija alternattiva tajba. Hashes qodma ta' MD5 jew SHA-1 tibdluhom billi tgħatuhom minnufih ġo password_hash u tissostitwuhom, fil-login li jmiss, b'hash dirett.

X'għandu x'jaqsam it-tnixxija tad-database mal-hashes tagħkom

Wara dħul f'web server, id-database hija waħda mill-ewwel miri. Min jista' jesegwixxi kodiċi fuq is-server, kif hu possibbli b'PHP2Shell, jaqra wkoll id-dettalji tal-aċċess tal-applikazzjoni u b'hekk it-tabella tal-kontijiet tal-utenti. Jekk il-passwords fiha jsiru leġġibbli wara sigħat jew wara snin, dan ma jiddeċiedix fil-jum tal-attakk, imma waqt il-programmar.

Sorprendentement ħafna applikazzjonijiet għadhom jaħżnu l-passwords b'proċeduri li qatt ma kienu maħsuba għal dan l-iskop: MD5, SHA-1, SHA-256 sempliċi jew saħansitra ċċifrati b'mod riversibbli. Dawn il-proċeduri huma mgħaġġla, u eżattament dan huwa l-problema. L-attakkanti jistgħu b'hekk jippruvaw ħafna kandidati kull sekonda.

PHP għandu żmien twil li jġib soluzzjoni li tikkalkula bil-mod, toħloq awtomatikament salt għal kull password u taħżen il-proċedura u l-parametri fl-hash stess. Trid sempliċement tużawha b'mod konsistenti.

password_hash f'PHP: bcrypt jew Argon2id?

password_hash() jaf diversi proċeduri. L-għażla skont il-manwal ta' PHP:

Kostanti Proċedura Nota
PASSWORD_DEFAULT bħalissa bcrypt Valur awtomatiku, jista' jinbidel f'verżjonijiet futuri
PASSWORD_BCRYPT bcrypt Fattur tal-ispiża minn PHP 8.4 b'mod awtomatiku 12, qabel 10; jgħoddu biss l-ewwel 72 byte
PASSWORD_ARGON2I Argon2i minn PHP 7.2, biss jekk PHP inbena b'appoġġ għal Argon2
PASSWORD_ARGON2ID Argon2id minn PHP 7.3, l-istess prerekwiżit

OWASP jirrakkomanda Argon2id bħala l-ewwel għażla, b'mill-inqas 19 MiB ta' memorja, żewġ passaġġi u thread wieħed, u bcrypt l-aktar għal sistemi eżistenti. Għall-biċċa l-kbira tal-applikazzjonijiet PHP id-differenza fil-prattika hija iżgħar mid-differenza bejn kwalunkwe waħda minn dawn il-proċeduri u MD5. L-aktar importanti huwa li tużaw waħda minnhom u li tadattaw il-parametri regolarment.

Jekk Argon2id hux disponibbli jurih test qasir:

<?php
var_dump(defined('PASSWORD_ARGON2ID'));
var_dump(password_algos());

Aħżen u ivverifika: mudell komplut

L-eżempju li ġej juri r-reġistrazzjoni u l-login b'aġġornament awtomatiku ta' hashes skaduti. Il-verifika tat-tul tipproteġi mil-limitu ta' 72 byte ta' bcrypt:

<?php
declare(strict_types=1);

const PASSWORT_ALGO = PASSWORD_DEFAULT;

function passwortSpeichern(string $passwort): string
{
    if (strlen($passwort) > 72) {
        throw new InvalidArgumentException('Passwort zu lang für das gewählte Verfahren.');
    }
    return password_hash($passwort, PASSWORT_ALGO);
}

function passwortPruefen(string $eingabe, string $gespeicherterHash, callable $hashAktualisieren): bool
{
    if (!password_verify($eingabe, $gespeicherterHash)) {
        return false;
    }
    if (password_needs_rehash($gespeicherterHash, PASSWORT_ALGO)) {
        $hashAktualisieren(password_hash($eingabe, PASSWORT_ALGO));
    }
    return true;
}

strlen() jgħodd byte, mhux karattri. Dan hawnhekk huwa intenzjonat, għax il-limitu ta' bcrypt jirreferi għal byte. Il-kolonna fid-database għandha, skont il-manwal, tkun tista' żżomm aktar minn 60 karattru, 255 huwa għażla tajba. Qatt ma twaqqfu salt proprju: l-għażla hija skaduta u minn PHP 8.0 tiġi injorata.

Mal-bidla għal PHP 8.4 il-fattur tal-ispiża awtomatiku għal bcrypt jogħla minn 10 għal 12. Hashes eżistenti, grazzi għal password_needs_rehash(), jiżdiedu awtomatikament fil-login li jmiss. Fuq sistemi mgħobbija ħafna jixraq qabel il-bidla test qasir tat-tagħbija tal-login.

Suġġeriment

Ikkalkulaw il-fattur tal-ispiża fuq is-server tal-produzzjoni tagħkom. Verifika waħda għandha tieħu ħin ta' kalkolu apprezzabbli, imma tibqa' b'mod ċar taħt sekonda, biex il-logins ma jsirux konġestjoni meta jkun hemm tagħbija.

Neħħu hashes qodma ta' MD5 u SHA-1

L-isfida vera hija ġeneralment l-istokk eżistenti. Il-passwords stess ma tafuhomx, allura ma tistgħux sempliċement terġgħu tagħmluhom hash. Li tistennew sakemm kull utent jerġa' jidħol iħalli kontijiet inattivi mhux protetti. OWASP għalhekk jiddeskrivi proċedura f'żewġ stadji:

  1. Daħħlu minnufih: Kull valur eżistenti ta' MD5 jew SHA-1 agħmluh b'skript ġo password_hash() u aħżnuh b'marka, pereżempju f'kolonna hash_typ.
  2. Ivverifikaw fil-login: Għall-kontijiet immarkati l-ewwel ikkalkulaw l-input bil-proċedura l-qadima u mbagħad ivverifikaw b'password_verify() kontra l-valur ippakkjat.
  3. Issostitwixxu direttament: Wara login b'suċċess oħolqu hash normali mit-test ċar u neħħu l-marka.
  4. Naddfu l-bqija: Kontijiet li wara terminu stabbilit għad għandhom hashes ippakkjati, poġġuhom fuq reset tal-password.
<?php
// Stadju 1 (darba b'skript): $neu = password_hash($alterMd5Wert, PASSWORD_DEFAULT);
// Stadju 2 u 3 fil-login:
if ($konto['hash_typ'] === 'md5-umhuellt') {
    $ok = password_verify(md5($eingabe), $konto['passwort_hash']);
    if ($ok) {
        $speichere(password_hash($eingabe, PASSWORD_DEFAULT), 'direkt');
    }
}

Hashes ippakkjati huma aħjar minn valuri xotti ta' MD5, imma aktar dgħajfa minn hashes diretti. Huma soluzzjoni ta' tranżizzjoni, mhux għan. Wara inċident li fih id-database tista' tkun affettwata, din il-bidla ma tissostitwix it-talba lill-utenti biex ibiddlu l-passwords tagħhom. Liema traċċi jindikaw inċident bħal dan jiddeskrivi Diġà kompromess?.

Pepper, ċifrar u mogħdijiet żbaljati oħra

Xi ideat jinstemgħu bħala aktar sigurtà, imma jġibu ftit jew jagħmlu ħsara:

  • Kostruzzjonijiet proprji ta' hash bħal SHA-256 b'ripetizzjonijiet b'salt iġġenerat minnkom huma aktar mgħaġġla minn bcrypt u għalhekk aktar dgħajfa.
  • Passwords ċċifrati huma riversibbli. Jekk iċ-ċavetta tinsab fuq l-istess server, iċ-ċifrar wara dħul bilkemm jipproteġi.
  • Pepper, jiġifieri valur sigriet addizzjonali għall-passwords kollha, jista' jkun saff addizzjonali jekk jinżamm separat mid-database. Imma ma jissostitwix proċedura tajba ta' hash u jagħmel bidliet futuri aktar diffiċli.
  • Pre-hashing qabel bcrypt, biex jiġi evitat il-limitu ta' 72 byte, iġorr, skont OWASP, riskji proprji. Limitu ċar tat-tul jew Argon2id huwa aktar sempliċi.

Anke fir-regoli għal passwords ġodda jixraq li titfgħu ħarsa lejn l-istat tat-teknika: it-tul jipproteġi aktar minn rekwiżiti kumplessi dwar karattri speċjali, u passwords komuni ħafna jew li diġà dehru fi tnixxijiet tad-data għandhom jiġu miċħuda. Bidliet furzati f'intervalli fissi mingħajr motiv, skont l-esperjenza, iwasslu aktar għal mudelli prevedibbli milli għal passwords aktar b'saħħithom.

Għal sistemi ta' login il-passwords ma jibqgħux qatt waħedhom: proċeduri b'żewġ fatturi għall-admins u brejk kontra tentattivi massivi ta' login jissupplimentaw l-ħażna. It-tnejn jittrattahom il-gwida Ipproteġi l-logins tal-admin minn brute force. Għal links ta' reset u kodiċijiet ta' darba japplikaw regoli oħra, ara Numri każwali u tokens sikuri f'PHP. Ħarsa ġenerali lejn funzjonijiet oħra tagħti Funzjonijiet ta' sigurtà inkorporati ta' PHP.

Kif tgħin PHP SOS b'mod konkret?

  • Niċċekkjaw kif l-applikazzjoni u l-plugins tagħkom jaħżnu l-passwords u nsibu proċeduri skaduti anke f'funzjonijiet sekondarji.
  • Nippjanaw il-bidla tal-istokk b'ippakkjar, migrazzjoni fil-login u terminu għall-kontijiet li jifdal.
  • Nadattaw il-fattur tal-ispiża jew il-parametri ta' Argon2 għas-servers tagħkom.
  • Wara inċident insostnu d-deċiżjoni dwar resets tal-password u l-implimentazzjoni teknika tagħhom.

Verifika tas-softwer PHP proprju noffruha bħala Awditu tas-sigurtà u test ta' penetrazzjoni.

Mistoqsijiet frekwenti

Liema algoritmu juża password_hash b'PASSWORD_DEFAULT?

Bħalissa bcrypt. Il-manwal ta' PHP jindika li l-valur awtomatiku jista' jinbidel meta jiżdiedu proċeduri aktar b'saħħithom. Għalhekk il-kolonna tad-database għandha tkun tista' żżomm aktar minn 60 karattru; il-manwal isemmi 255 bħala għażla tajba.

Għandi niċċifra l-passwords minflok nagħmilhom hash?

Le. Passwords iċċifrati jistgħu jinqraw mill-ġdid biċ-ċavetta, u din iċ-ċavetta spiss tinsab fuq l-istess server. Hash ta' password huwa triq f'direzzjoni waħda: l-applikazzjoni tista' biss tivverifika jekk input jaqbilx.

Kemm għandu jkun għoli l-fattur tal-ispiża f'bcrypt?

Minn PHP 8.4 il-valur awtomatiku huwa 12, qabel 10. OWASP isemmi 10 bħala l-limitu l-aktar baxx u jirrakkomanda li tgħollu daqs kemm jifilħu s-servers tagħkom. Ikkalkulaw fuq il-hardware proprju kemm idum jieħu verifika waħda.

X'tfisser il-limitu ta' 72 byte f'bcrypt?

bcrypt jikkunsidra biss l-ewwel 72 byte ta' password, dak li jiġi wara jinqata'. Fil-każ ta' karattri speċjali, karattru wieħed spiss jgħodd żewġ byte. Illimitaw it-tul b'mod espliċitu jew uża Argon2id jekk PHP tagħkom huwa kkumpilat miegħu.

L-utenti jridu jbiddlu l-passwords wara dħul?

Jekk ma jistax jiġi eskluż li d-database ħarġet, għandkom tirranġaw dan. Hashes tajbin inaqqsu b'mod konsiderevoli l-qsim, imma passwords dgħajfa jibqgħu vulnerabbli. Jekk teżistix barra minn hekk obbligu ta' notifika, iċċaruh mal-uffiċjal tal-protezzjoni tad-data tagħkom.

Sorsi

Kuntatt immedjat

Kull siegħa tgħodd. Iktbu lilna issa.

Iddeskrivu fil-qosor is-sistema, il-verżjoni ta' PHP u dak li osservajtu. Nikkuntattjawkom, niċċaraw is-sitwazzjoni u naħdmu mill-bogħod sakemm l-inċident jingħalaq u jiġi ddokumentat.

Għajnuna immedjata