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().
Link li huwa faċli wisq biex jiġi ddeduċut
„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:
- Aħżen biss l-hash: Fid-database jidher
hash('sha256', $token), it-token innifsu jmur biss permezz tal-link lill-utent. - Illimita l-validità: Aħżen ukoll il-ħin tal-iskadenza u ivverifikah meta jiġi użat.
- Uża darba biss: Wara użu b'suċċess ħassar l-entrata jew immarkaha bħala użata.
- Invalida meta jkun hemm bidliet: Wara bidla tal-password ħassar it-tokens kollha ta' reset miftuħin tal-kont.
- 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.
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.