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 →

Numri każwali u tokens sikuri f'PHP b'random_bytes

Kif l-iżviluppaturi joħolqu f'PHP tokens għal links tal-password, ċwievet tal-API u kodiċijiet ta' darba: sorsi kriptografikament sikuri, tul biżżejjed, ħażna bħala hash u validità limitata.

Stat 6 min. qariŻvilupp sigur

Fil-qosor: Tokens sikuri toħolquhom f'PHP b'random_bytes(), pereżempju 32 byte, li tikkonvertuhom f'test b'bin2hex() jew Base64-URL. Għal numri każwali f'firxa hemm random_int(), għal kodiċijiet minn sett fiss ta' karattri minn PHP 8.3 Random\Randomizer::getBytesFromString(). Tokens taħżnuhom bħala hash, tillimitaw il-validità tagħhom, tużawhom darba biss u tqabbluhom b'hash_equals().

„Insejt il-password?“ Klikk, u s-sistema tibgħat link b'kodiċi twil. Min jaf il-link jista' jissettja l-password. Eżattament għalhekk dan il-kodiċi jrid ikun imprevedibbli. Jekk mhuwiex, attakkant ma jeħtieġx la l-kaxxa tal-posta u lanqas il-password qadima, biss biżżejjed tentattivi.

Fil-verifiki ta' applikazzjonijiet PHP jinstabu sorprendentement spiss tokens mibnija mill-ħin, mill-ID tal-utent jew minn ġeneratur sempliċi ta' numri każwali. Jidhru twal u każwali, imma mhumiex. L-istess japplika għal ċwievet tal-API, links ta' stedina, links ta' approvazzjoni għal dokumenti, kodiċijiet ta' konferma u tokens CSRF.

Ir-riskju huwa konkret: link ta' reset prevedibbli jippermetti l-ħatfa ta' kull kont li l-indirizz tal-posta tiegħu huwa magħruf, mingħajr ma s-sid jinduna b'xi ħaġa sakemm hu stess ma jkunx jista' jidħol aktar.

PHP joffri minn verżjoni 7.0 soluzzjoni sempliċi u sigura. Trid biss tintuża b'mod konsistenti.

random_bytes f'PHP: minn fejn jiġu valuri każwali sikuri

random_bytes() skont il-manwal ta' PHP jagħti byte każwali kriptografikament sikuri, adattati wkoll għal sigrieti li jgħixu ħafna, bħal ċwievet. Il-funzjoni tuża s-sors każwali tas-sistema operattiva, taħt Linux pereżempju getrandom(), taħt Windows l-interface CNG. Jekk ma ssibx sors adattat, minn PHP 8.2 titfa Random\RandomException.

Il-ħarsa ġenerali turi liema funzjonijiet iservu għal sigrieti:

Funzjoni Adattata għal tokens? Nota
random_bytes() iva byte sikuri, minn PHP 7.0
random_int() iva numru sigur f'firxa, minn PHP 7.0
Random\Randomizer bl-engine Secure iva Secure hija, skont il-manwal, l-engine awtomatika
rand(), mt_rand() le prevedibbli, biss għal skopijiet mhux rilevanti għas-sigurtà
uniqid() le ibbażat fuq il-ħin, maħsub għall-unikità
md5(time()), sha1($id) le input jista' jiġi ddeduċut, l-hash ma jibdel xejn minn dan
str_shuffle(), array_rand() le ma jużawx ġeneratur sigur

Oħloq tokens: tul u kodifika

32 byte każwali jikkorrispondu għal 256 bit u għal kważi kull skop huma aktar minn biżżejjed. Għat-trasferiment f'links jew headers it-token irid jinbidel f'test. Żewġ varjanti huma komuni:

<?php
declare(strict_types=1);

// Hex: 64 karattru, biss 0-9 u a-f
$tokenHex = bin2hex(random_bytes(32));

// Base64-URL: 43 karattru, sigur f'URLs mingħajr kodifika oħra
$tokenUrl = rtrim(strtr(base64_encode(random_bytes(32)), '+/', '-_'), '=');

// Numru każwali f'firxa, pereżempju għal għażla
$index = random_int(0, 9);

// Minn PHP 8.3: kodiċi numeriku ta' sitt ċifri, pereżempju għal konferma b'SMS
$randomizer = new \Random\Randomizer();
$code = $randomizer->getBytesFromString('0123456789', 6);

Kodiċijiet numeriċi qosra huma difendibbli biss jekk in-numru ta' tentattivi huwa limitat b'mod strett u l-kodiċi jiskadi wara ftit minuti. Għal links li jintbagħtu bil-posta, dejjem uża t-token twil.

Għal ċwievet tal-API li sħab jew sistemi proprji jużaw b'mod permanenti, żewġ supplimenti wrew li jaħdmu. Prefiss qasir, mhux sigriet, qabel il-parti każwali, pereżempju għall-ambjent jew l-iskop, jiffaċilita l-għarfien fil-protokolli u meta jinstabu f'repositories tal-kodiċi. U ċ-ċavetta tintwera darba biss meta tinħoloq; wara s-sistema tkompli tafha biss bħala hash. Jekk ċavetta tintilef, tiġi sostitwita, mhux irkuprata.

Attenzjoni b'tokens magħmula internament li fihom informazzjoni, pereżempju ID tal-utent u ħin ta' skadenza f'Base64. Il-kodifika mhijiex sigurtà: kulħadd jista' jaqra u jibdel tokens bħal dawn. Jekk token għandu jġorr data, irid jiġi ffirmat b'ċavetta sigrieta, pereżempju b'hash_hmac('sha256', ...), u l-firma tiġi vverifikata b'hash_equals(). Għal każijiet aktar kumplessi libreriji vverifikati huma preferibbli għal kostruzzjonijiet proprji.

Aħżen, ivverifika u ħalli tiskadi t-tokens

Token iġġenerat b'mod sigur huwa nofs ix-xogħol biss. Mill-inqas daqstant importanti hu kif l-applikazzjoni tittrattah. Proċedura mgħarrba għal links ta' reset u ta' stedina:

  1. Aħżen biss l-hash: Fid-database jidher hash('sha256', $token), it-token innifsu jmur biss permezz tal-link lill-utent.
  2. Illimita l-validità: Aħżen ukoll il-ħin tal-iskadenza u ivverifikah meta jiġi użat.
  3. Uża darba biss: Wara użu b'suċċess ħassar l-entrata jew immarkaha bħala użata.
  4. Invalida meta jkun hemm bidliet: Wara bidla tal-password ħassar it-tokens kollha ta' reset miftuħin tal-kont.
  5. Qabbel b'mod kostanti: Fejn token jitqabbel direttament ma' valur maħżun, uża hash_equals(), bil-valur maħżun bħala l-ewwel parametru.
<?php
// Ħolqien
$token = bin2hex(random_bytes(32));
$eintrag = [
    'konto_id'   => $kontoId,
    'token_hash' => hash('sha256', $token),
    'gueltig_bis'=> (new DateTimeImmutable('+30 minutes'))->format('Y-m-d H:i:s'),
];
// ibgħat $token biss fil-link, aħżen $eintrag

// Użu
$gesucht = hash('sha256', (string) ($_GET['token'] ?? ''));
// Fittex l-entrata permezz ta' prepared statement fuq token_hash,
// ivverifika l-iskadenza, imbagħad ħassar l-entrata minnufih

Illimitaw ukoll in-numru ta' talbiet ta' reset għal kull kont u perjodu, biex il-funzjoni ma tiġix abbużata għal ibgħat bil-massa ta' emails. It-tweġiba għal talba ta' reset m'għandhiex barra minn hekk tiżvela jekk l-indirizz indikat għandux kont fl-ewwel lok.

Hash mgħaġġel bħal SHA-256 hawnhekk huwa biżżejjed, għax it-token innifsu huwa diġà twil u każwali. Għal passwords li n-nies jagħżlu dan ma japplikax; hemmhekk hemm bżonn proċeduri bil-mod, kif jispjega Aħżen il-passwords f'PHP b'mod sigur.

Suġġeriment

Tokens ma jappartjenux f'fajls tal-log. Iċċekkjaw jekk is-server tal-web tagħkom jirreġistrax URLs kompluti b'parametri ta' query, u jekk rapporti ta' żbalji jibagħtux data tat-talba.

Wara inċident: iġġeddu tokens u ċwievet

Min seta' jesegwixxi kodiċi fuq server, ġeneralment kellu aċċess ukoll għal tokens maħżunin, ċwievet tal-API u data tas-sessjonijiet. Jekk wara PHP2Shell jew inċident ieħor hemm suspett ta' dħul, għalhekk iġġeddu mhux biss il-passwords, imma wkoll tokens u ċwievet li jgħixu ħafna: aċċessi tal-API, ċwievet tal-firma għal cookies jew links, aċċessi għal servizzi tal-ħlas u tal-konsenja.

Is-sessjonijiet huma każ speċjali: PHP joħloq is-session IDs hu stess. Kif tissiguraw l-issettjar tagħhom u tagħlqu s-sessjonijiet wara inċident jiddeskrivi l-gwida Ipproteġi s-sessjonijiet f'PHP. Għal tokens tal-formoli kontra talbiet falsifikati ara Protezzjoni CSRF f'applikazzjonijiet PHP. Għodod inkorporati oħra jippreżenta Funzjonijiet ta' sigurtà inkorporati ta' PHP.

Kif tgħin PHP SOS b'mod konkret?

  • Insibu fl-applikazzjoni tagħkom il-postijiet kollha fejn jinħolqu tokens, kodiċijiet u ċwievet u nissostitwixxu sorsi mhux sikuri.
  • Nivverifikaw il-ħażna, l-iskadenza u l-użu ta' darba ta' links ta' reset, ta' stedina u ta' approvazzjoni.
  • Niżguraw li tokens ma jispiċċawx f'logs, f'rapporti ta' żbalji jew f'għodod ta' analiżi.
  • Wara inċident nippjanaw magħkom l-iskambju ordnat ta' tokens u ċwievet.

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

Mistoqsijiet frekwenti

Għaliex mt_rand mhuwiex adattat għal tokens?

mt_rand u rand huma maħsuba għall-istatistika u l-logħob, mhux għal sigrieti. L-outputs tagħhom f'ċerti ċirkostanzi jistgħu jiġu previsti. Għal kull ħaġa li attakkant m'għandux jiddeduċi, uża random_bytes jew random_int.

Kemm għandu jkun twil token?

Għal links biex terġgħu tissettjaw passwords, stediniet jew ċwievet tal-API, 32 byte każwali huma għażla soda, bħala test hex 64 karattru. 16-il byte, jiġifieri 128 bit, huma limitu minimu mifrux.

uniqid huwa token sigur?

Le. uniqid huwa bbażat fuq il-ħin attwali u huwa maħsub għall-unikità, mhux għas-sigriet. Anke taħlitiet bħal md5 tal-ħin jew tal-ID tal-utent jistgħu jiġu previsti.

Jeħtieġ niċċifra tokens ta' reset fid-database?

Aħżnu minflok it-token hash tiegħu, pereżempju b'SHA-256. Min jaqra d-database ma jistax b'hekk jibni links validi. Peress li t-token innifsu huwa diġà twil u każwali, ma jeħtieġx proċedura bil-mod bħal fil-passwords.

X'jiġri jekk is-sistema ma ssibx sors każwali?

random_bytes u random_int minn PHP 8.2 jitfgħu Random\RandomException. Aqbdu dan il-każ u twaqqfu l-proċess, minflok ma tgħaddu għal sors aktar dgħajjef.

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