# Numri każwali u tokens sikuri f'PHP b'random_bytes

> Oħloq tokens sikuri f'PHP b'random_bytes u random_int: tul, kodifika, ħażna bħala hash, skadenza u funzjonijiet li għandkom tevitaw.

Sors: https://phpsos.de/mt/blog/sichere-tokens-php/  
Stat: 25/10/2026  
Fornitur: PHP SOS, Għajnuna ta' emerġenza għal PHP u sigurtà tas-server. Għajnuna immedjata fuq WhatsApp: https://wa.me/491736494914?text=Bongu%20PHP%20SOS%2C%20g%C4%A7andna%20b%C5%BConn%20g%C4%A7ajnuna%20bis-server%20tal-PHP%20tag%C4%A7na.%20Kumpanija%3A%20%E2%80%A6%20Websajt%3A%20%E2%80%A6

**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
<?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
<?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](https://phpsos.de/mt/blog/passwoerter-in-php-speichern/).

> **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](https://phpsos.de/mt/ratgeber/session-sicherheit-php/). Għal tokens tal-formoli kontra talbiet falsifikati ara [Protezzjoni CSRF f'applikazzjonijiet PHP](https://phpsos.de/mt/blog/csrf-schutz-php/). Għodod inkorporati oħra jippreżenta [Funzjonijiet ta' sigurtà inkorporati ta' PHP](https://phpsos.de/mt/php/eingebaute-sicherheitsfunktionen/).

## 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](https://phpsos.de/mt/leistungen/sicherheitsaudit-penetrationstest/).


## 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

- [Manwal ta' PHP: random_bytes](https://www.php.net/manual/de/function.random-bytes.php)
- [Manwal ta' PHP: Random\Randomizer::getBytesFromString](https://www.php.net/manual/de/random-randomizer.getbytesfromstring.php)
- [Manwal ta' PHP: hash_equals](https://www.php.net/manual/de/function.hash-equals.php)
- [OWASP Cheat Sheet Series](https://cheatsheetseries.owasp.org/)
