An cás reatha: PHP2Shell. Ceadaíonn dhá leochaileacht chriticiúla PHP (CVSS 9.2) cód mailíseach gan logáil isteach. Paistí ar fáil ón 21 Deireadh Fómhair 2026.Cad atá le déanamh anois →

Uimhreacha randamacha slána agus comharthaí i PHP le random_bytes

Conas a ghineann forbróirí i PHP comharthaí do naisc pasfhocail, eochracha API agus cóid aonuaire: foinsí slána go cripteagrafach, fad leordhóthanach, stóráil mar hash agus bailíocht theoranta.

Staid Am léitheoireachta: 6 nóim.Forbairt shlán

Go achomair: Gineann tú comharthaí slána i PHP le random_bytes(), 32 beart nó mar sin, a athraíonn tú ina dtéacs le bin2hex() nó le Base64-URL. Le haghaidh uimhreacha randamacha laistigh de raon tá random_int(), agus le haghaidh cód ó thacar carachtar seasta tá Random\Randomizer::getBytesFromString() ó PHP 8.3. Stórálann tú comharthaí mar hash, cuireann tú teorainn lena mbailíocht, úsáideann tú iad uair amháin agus déanann tú comparáid leo le hash_equals().

Nasc atá ró-éasca le buille faoi thuairim a thabhairt faoi

„Pasfhocal dearmadta?“ Cliceáil amháin, agus seolann an córas nasc le cód fada. An té a bhfuil an nasc ar eolas aige, is féidir leis an pasfhocal a shocrú. Is é sin go beacht an fáth a gcaithfidh an cód seo a bheith do-thuartha. Mura bhfuil, níl bosca poist ná seanphasfhocal de dhíth ar ionsaitheoir, ach go leor iarrachtaí.

I seiceálacha ar fheidhmchláir PHP faightear comharthaí go minic atá tógtha ón uair, ó ID an úsáideora nó ó ghineadóir simplí uimhreacha randamacha. Tá cuma fhada randamach orthu, ach níl siad. Is amhlaidh d'eochracha API, do naisc chuiridh, do naisc comhroinnte doiciméad, do chóid dheimhniúcháin agus do chomharthaí CSRF.

Tá an riosca soladach: ligeann nasc athshocraithe intuartha cuntas ar bith a ghlacadh a bhfuil a sheoladh ríomhphoist ar eolas, gan go dtugann an t-úinéir faoi deara go dtí nach féidir leis logáil isteach é féin a thuilleadh.

Tairgeann PHP réiteach simplí slán ó leagan 7.0. Níl le déanamh ach é a úsáid go comhsheasmhach.

random_bytes i PHP: cárb as a dtagann luachanna randamacha slána

Tugann random_bytes() de réir lámhleabhar PHP bearta randamacha slána go cripteagrafach, atá oiriúnach do rúin fhadsaolacha ar nós eochracha freisin. Úsáideann an fheidhm foinse randamachta an chórais oibriúcháin, faoi Linux mar shampla getrandom(), faoi Windows an comhéadan CNG. Mura bhfaigheann sí foinse oiriúnach, caitheann sí Random\RandomException ó PHP 8.2.

Léiríonn an forbhreathnú cé na feidhmeanna a oireann do rúin:

Feidhm An bhfuil sí oiriúnach do chomharthaí? Nóta
random_bytes() tá bearta slána, ó PHP 7.0
random_int() tá uimhir shlán i raon, ó PHP 7.0
Random\Randomizer le inneall Secure tá is é Secure an gnáthinneall de réir an lámhleabhair
rand(), mt_rand() níl intuartha, do chuspóirí nach mbaineann le slándáil amháin
uniqid() níl bunaithe ar am, ceaptha d'uathúlacht
md5(time()), sha1($id) níl is féidir an t-ionchur a thomhas, ní athraíonn hash é
str_shuffle(), array_rand() níl ní úsáideann siad gineadóir slán

Comharthaí a ghiniúint: fad agus ionchódú

Is ionann 32 beart randamach agus 256 giotán agus is mó ná go leor iad d'fhormhór na gcuspóirí. Le haghaidh tarchuir i naisc nó i gceanntásca ní mór an comhartha a athrú ina théacs. Tá dhá leagan coitianta:

<?php
declare(strict_types=1);

// Heics: 64 carachtar, 0-9 agus a-f amháin
$tokenHex = bin2hex(random_bytes(32));

// Base64-URL: 43 carachtar, slán in URLanna gan ionchódú breise
$tokenUrl = rtrim(strtr(base64_encode(random_bytes(32)), '+/', '-_'), '=');

// Uimhir randamach i raon, mar shampla le haghaidh roghnúcháin
$index = random_int(0, 9);

// Ó PHP 8.3: cód uimhriúil sé dhigit, m.sh. le haghaidh deimhniú trí SMS
$randomizer = new \Random\Randomizer();
$code = $randomizer->getBytesFromString('0123456789', 6);

Is inghlactha cóid ghearra uimhriúla ach amháin nuair a bhíonn líon na n-iarrachtaí teoranta go docht agus an cód ag dul as feidhm tar éis cúpla nóiméad. Le haghaidh naisc a sheoltar trí ríomhphost, úsáid an comhartha fada i gcónaí.

Le haghaidh eochracha API a úsáideann comhpháirtithe nó córais féin go buan, d'éirigh le dhá fhorlíonadh. Éascaíonn réimír ghearr nach bhfuil rúnda roimh an gcuid randamach, mar shampla don timpeallacht nó don chuspóir, iad a aithint i logaí agus nuair a aimsítear iad i stórtha cóid. Agus ní thaispeántar an eochair ach uair amháin nuair a chruthaítear í; ina dhiaidh sin ní bhíonn ar eolas ag an gcóras ach a hash. Má chailltear eochair, cuirtear ceann eile ina háit, ní athchóirítear í.

Bí cúramach le comharthaí féintógtha a bhfuil faisnéis iontu, mar shampla ID úsáideora agus am éaga i Base64. Ní cosaint é ionchódú: is féidir le gach duine comharthaí den sórt sin a léamh agus a athrú. Má tá comhartha chun sonraí a iompar, caithfear é a shíniú le heochair rúnda, mar shampla le hash_hmac('sha256', ...), agus seiceáiltear an síniú le hash_equals(). I gcásanna níos casta is fearr leabharlanna seiceáilte ná tógálacha féin.

Comharthaí a stóráil, a sheiceáil agus a ligean in éag

Níl i gcomhartha a ghintear go slán ach leath den obair. Tá sé chomh tábhachtach céanna conas a láimhseálann an feidhmchlár é. Cur chuige tástáilte do naisc athshocraithe agus chuiridh:

  1. An hash amháin a stóráil: Sa bhunachar sonraí tá hash('sha256', $token), ní théann an comhartha féin chuig an úsáideoir ach trí nasc.
  2. Bailíocht a theorannú: An t-am éaga a stóráil leis agus é a sheiceáil nuair a úsáidtear é.
  3. Aon uair amháin a úsáid: Tar éis úsáide rathúla an iontráil a scriosadh nó í a mharcáil mar chaite.
  4. Ag athruithe, iad a chur ar neamhní: Tar éis athrú pasfhocail, gach comhartha athshocraithe oscailte den chuntas a scriosadh.
  5. Comparáid in am seasta: Nuair a chuirtear comhartha i gcomparáid go díreach le luach stóráilte, hash_equals() a úsáid leis an luach stóráilte mar chéad pharaiméadar.
<?php
// Giniúint
$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'),
];
// $token a sheoladh sa nasc amháin, $eintrag a stóráil

// Úsáid
$gesucht = hash('sha256', (string) ($_GET['token'] ?? ''));
// An iontráil a chuardach trí token_hash le ráiteas ullmhaithe,
// an t-éag a sheiceáil, ansin an iontráil a scriosadh láithreach

Cuir teorainn freisin le líon na n-iarratas athshocraithe do gach cuntas agus tréimhse, ionas nach féidir an fheidhm a mhí-úsáid chun ríomhphoist a sheoladh ar mhórscála. Ina theannta sin níor cheart don fhreagra ar iarratas athshocraithe a nochtadh an bhfuil cuntas ag an seoladh a tugadh ar chor ar bith.

Is leor hash tapa ar nós SHA-256 anseo, toisc go bhfuil an comhartha féin fada agus randamach cheana. Ní bhaineann sé sin le pasfhocail a roghnaíonn daoine; ansin tá modhanna mall de dhíth, mar a mhíníonn Pasfhocail a stóráil go slán i PHP.

Leid

Ní bhaineann comharthaí le comhaid loga. Seiceáil an logálann do fhreastalaí gréasáin URLanna iomlána le paraiméadair cheistiúcháin, agus an seolann tuarascálacha earráide sonraí an iarratais leo.

Tar éis teagmhais: comharthaí agus eochracha a athnuachan

An té a d'fhéadfadh cód a rith ar fhreastalaí, bhí rochtain aige de ghnáth ar chomharthaí stóráilte, ar eochracha API agus ar shonraí seisiúin freisin. Má tá amhras ann faoi bhriseadh isteach tar éis PHP2Shell nó teagmhais eile, ba cheart duit dá bhrí sin ní hamháin pasfhocail ach comharthaí agus eochracha fadsaolacha a athnuachan: rochtain API, eochracha sínithe d'fhianáin nó de naisc, rochtain ar sheirbhísí íocaíochta agus seoltóireachta.

Is cás speisialta iad seisiúin: gineann PHP ID seisiúin é féin. Conas a socruithe a chosaint agus seisiúin a chur i gcrích tar éis teagmhais, déanann an treoir Seisiúin i PHP a chosaint cur síos air. Le haghaidh comharthaí foirme i gcoinne iarratas brionnaithe, féach Cosaint CSRF i bhfeidhmchláir PHP. Cuireann Feidhmeanna slándála ionsuite PHP uirlisí ionsuite eile i láthair.

Conas a chabhraíonn PHP SOS go nithiúil?

  • Aimsímid i d'fheidhmchlár gach áit ina ngintear comharthaí, cóid agus eochracha, agus cuirimid foinsí slána in ionad foinsí neamhshlán.
  • Seiceálaimid stóráil, éag agus aon úsáid amháin naisc athshocraithe, chuiridh agus chomhroinnte.
  • Cinntímid nach dtéann comharthaí isteach i logaí, i dtuarascálacha earráide ná in uirlisí anailíse.
  • Tar éis teagmhais pleanálaimid leat comharthaí agus eochracha a mhalartú go hordúil.

Tairgimid seiceáil ar bhogearraí PHP féin mar iniúchadh slándála agus tástáil threáite.

Ceisteanna coitianta

Cén fáth nach bhfuil mt_rand oiriúnach do chomharthaí?

Tá mt_rand agus rand ceaptha d'staidreamh agus do chluichí, ní do rúin. Is féidir a n-aschuir a thuar i gcúinsí áirithe. Do gach rud nach mór d'ionsaitheoir buille faoi thuairim a thabhairt faoi, úsáid random_bytes nó random_int.

Cé chomh fada ba cheart comhartha a bheith?

Do naisc chun pasfhocail a athshocrú, do chuirí nó d'eochracha API, is rogha chiallmhar 32 beart randamach, mar théacs heicsidheachúlach 64 carachtar. Is íostairseach choitianta é 16 bheart, is é sin 128 giotán.

An comhartha slán é uniqid?

Ní hea. Tá uniqid bunaithe ar an am reatha agus tá sé ceaptha d'uathúlacht, ní do rúndacht. Is intuartha freisin comhcheangail ar nós md5 den am nó d'ID úsáideora.

An gcaithfidh mé comharthaí athshocraithe a chriptiú sa bhunachar sonraí?

Stóráil hash de in ionad an chomhartha, mar shampla le SHA-256. Ní féidir leis an té a léann an bunachar sonraí naisc bhailí a thógáil leis. Toisc go bhfuil an comhartha féin fada agus randamach cheana, níl modh mall de dhíth, murab ionann agus le pasfhocail.

Cad a tharlaíonn mura bhfaigheann an córas foinse randamachta?

Caitheann random_bytes agus random_int Random\RandomException ó PHP 8.2. Gabh an cás seo agus cuir deireadh leis an bpróiseas in ionad dul chuig foinse níos laige.

Foinsí

Teagmháil láithreach

Cuireann gach uair an chloig leis. Scríobh chugainn anois.

Déan cur síos gearr ar an gcóras, leagan PHP agus an rud a thug tú faoi deara. Cuirfimid scéala chugat, soiléireoimid an cás agus oibreoimid go cianda go dtí go mbeidh an teagmhas dúnta agus doiciméadaithe.

Cabhair láithreach