Go achomair: I slándáil unserialize PHP baineann riail shimplí: ná próiseáil sonraí a thagann ón taobh amuigh le unserialize() riamh. Úsáid JSON ina ionad. Nuair a chaithfear unserialize() ó sheancód a choinneáil, teorannaigh é le allowed_classes => false agus seiceáil barántúlacht na sonraí le síniú.
An rud a fhéadann dul chun donais le unserialize()
Is féidir le PHP eagair agus réada a thiontú ina sreang charachtar le serialize() agus iad a athchruthú le unserialize(). Tá sé áisiúil chun sonraí a stóráil i bhfianáin, i dtaiscí nó i réimsí bunachair sonraí. An fhadhb: cruthaíonn unserialize() réada d'aicmí treallacha freisin, ar féidir iad a luchtú san fheidhmchlár.
Agus réad den sórt sin á chruthú agus ar a dhéanaí agus á scriosadh, glaonn PHP modhanna áirithe go huathoibríoch, mar shampla __wakeup(), __unserialize() nó __destruct(). Má tá modhanna den sórt sin in aicmí sa tionscadal nó i leabharlanna le gníomhartha comhad, bunachair sonraí nó córais, is féidir le hionsaitheoir iad a úsáid chuig críoch eile trí shonraí ionramháilte. Labhraíonn saineolaithe ar PHP Object Injection. De réir na n-aicmí atá ann, ritheann an éifeacht ó chomhaid aonair a scriosadh go cód mailíseach a rith.
Achoimrithe do dhaoine nach teicneoirí iad: is féidir le glao amháin gan smaoineamh san áit mhícheart ionsaitheoir a ligean isteach go domhain san fheidhmchlár. Dá bhrí sin tá an laige seo ar cheann de théamaí an OWASP Top 10 leis na blianta.
An rogha shlán: JSON in ionad unserialize
Do bheagnach gach cás ina dtagann sonraí ón taobh amuigh nó ina n-fágann siad an freastalaí, is é JSON an rogha cheart. Ní chruthaíonn json_decode() ach eagair, uimhreacha, sreanga carachtar agus luachanna fírinne, ní réada d'aicmí féin.
<?php
declare(strict_types=1);
function leseEinstellungen(string $eingabe): array
{
try {
$daten = json_decode($eingabe, true, 16, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
throw new InvalidArgumentException('Ungültige Daten.');
}
if (!is_array($daten)) {
throw new InvalidArgumentException('Erwartet wurde ein Objekt.');
}
// Ná glac ach le réimsí aitheanta leis na cineálacha a bhfuiltear ag súil leo
return [
'sprache' => in_array($daten['sprache'] ?? '', ['de', 'en'], true) ? $daten['sprache'] : 'de',
'seiten' => max(1, min(100, (int) ($daten['seiten'] ?? 20))),
];
}
Tá an dara cuid tábhachtach: is ionchuir iad sonraí JSON freisin. Ná glac ach le réimsí a bhfuiltear ag súil leo agus seiceáil cineálacha agus raonta luachanna sular oibríonn tú leo.
Nuair nach féidir unserialize a sheachaint: allowed_classes agus síniú
I seanfheidhmchláir bíonn sonraí sraitheaite i mbunachair sonraí nó i dtaiscí go minic nach féidir a athrú láithreach. Ansin teorannaíonn tú an riosca i dhá chéim. Ar dtús cuireann tú cosc ar réada a chruthú le allowed_classes. Ar an dara dul síos, cinntíonn tú le síniú HMAC gur ó d'fheidhmchlár a thagann na sonraí i ndáiríre agus nár athraíodh iad ar an mbealach.
<?php
declare(strict_types=1);
const SCHLUESSEL = 'aus-sicherer-konfiguration-laden'; // riamh sa stór cóid
function verpacken(array $daten): string
{
$roh = serialize($daten);
return hash_hmac('sha256', $roh, SCHLUESSEL) . '.' . base64_encode($roh);
}
function auspacken(string $paket): array
{
[$signatur, $b64] = array_pad(explode('.', $paket, 2), 2, '');
$roh = base64_decode($b64, true);
if ($roh === false || !hash_equals(hash_hmac('sha256', $roh, SCHLUESSEL), $signatur)) {
throw new RuntimeException('Signatur ungültig.');
}
$daten = unserialize($roh, ['allowed_classes' => false, 'max_depth' => 16]);
if (!is_array($daten)) {
throw new RuntimeException('Unerwartetes Format.');
}
return $daten;
}
Má theastaíonn aicmí áirithe ar aon nós, ainmnigh iad ina n-aonar i allowed_classes, seachas iad uile a cheadú. Baineann an eochair le cumraíocht an fhreastalaí nó le stór rúin agus ní mór í a athnuachan tar éis teagmhais.
Sonraí atá ann cheana a aistriú go JSON céim ar chéim
I bhfeidhmchláir a d'fhás, bíonn luachanna sraitheaite sa bhunachar sonraí go minic ar feadh blianta. Tá aistriú i gcéim amháin riosca ansin. Tá aistriú cruthaithe: léann an feidhmchlár an dá fhormáid, ach ní scríobhann ach JSON a thuilleadh. Agus seanluach á léamh, díphacáiltear uair amháin é le allowed_classes => false agus scríobhtar ar ais láithreach é mar JSON. Tar éis tamaill tá formhór na n-iontrálacha aistrithe, agus déanann script aonuaire an chuid eile.
Logáil le linn an aistrithe cé chomh minic a léitear an seanfhormáid fós, agus freisin nuair nach n-oireann sínithe. D'fhéadfadh teipeanna den sórt sin iarrachtaí ionramhála a léiriú agus baineann siad leis an monatóireacht. Nuair nach dtagann seanfhormáid chun solais a thuilleadh amháin, bain an brainse unserialize() go hiomlán den chód.
Dí-shraitheadú folaithe: seisiúin, taisce agus cosáin comhad
Níl gach dí-shraitheadú le feiceáil go sofheicthe i do chód féin. Seiceáil na háiteanna seo freisin:
- Seisiúin: Sraitheaíonn PHP sonraí seisiúin go huathoibríoch. Fad is nach féidir le hionsaitheoirí na comhaid seisiúin a scríobh, níl sé criticiúil. Déanann an treoir Seisiúin i PHP a chosaint cur síos ar chosáin seisiún scartha do gach suíomh.
- Sraitheoirí seisiún: Baineann an chomhairle faoi CVE-2026-115560 le cumraíocht neamhghnách ina n-athraítear an
serialize_handlerle linn ama rite tríini_set()agus go bhfuil upload progress an tseisiúin gníomhach. Réiteach de réir php.net:session.upload_progress.enabled=0i php.ini nó sa linn FPM, ansin atosú na n-oibrithe. - Taisce agus scuaineanna: Níl Redis, Memcached ná táblaí bunachair sonraí le luachanna sraitheaite slán ach an oiread agus an rochtain orthu. Ní bhaineann siad leis an líonra oscailte.
- Feidhmeanna comhad le cosáin ó ionchuir: Ná tabhair cosáin ón iarratas d'fheidhmeanna comhad riamh. D'fhéadfadh wrapálaithe sruth ar nós
phar://próiseáil gan choinne a spreagadh murach sin. Cosnaíonn liosta ceadaithe d'ainmneacha comhad níos iontaofa ná aon scagadh. - Spleáchais: Leathnaíonn leabharlanna le laigí aitheanta féidearthachtaí ionsaitheora. Coinnigh cothrom le dáta iad, mar a thuairiscítear sa treoir Spleáchais Composer a sheiceáil le haghaidh bearnaí.
Áiteanna riosca a aimsiú sa chód
Éiríonn le chéad stocaireacht le cuardach simplí. Ní athraíonn sé rud ar bith ar an gcóras agus taispeánann sé gach glao lasmuigh den chomhadlann vendor:
grep -rn --include='*.php' 'unserialize(' /var/www/projekt \
| grep -v '/vendor/'
Measúnaigh gach torthaí le trí cheist: Cárb as a dtagann na sonraí? An féidir le húsáideoir iad a athrú? An bhfuil allowed_classes socraithe? Tá tosaíocht ag torthaí le hionchuir ó fhianáin, $_GET, $_POST, $_REQUEST nó comhéadain sheachtracha. Cuir JSON ina n-áit agus tástáil an t-aistriú sula gcuireann tú i bhfeidhm é.
Tá pointe tagartha eile sa bhrabhsálaí. Tá struchtúr tipiciúil ag sonraí PHP sraitheaite le haitheantóirí cineáil agus sonraí fad. Má aimsíonn tú luachanna den sórt sin i bhfianáin, i bpáirceanna foirme folaithe nó i bparaiméadair de do shuíomh gréasáin féin, thug an feidhmchlár sonraí sraitheaite don chuairteoir agus tá siad ag súil leo ar ais is dócha. Na háiteanna sin go beacht atá le seiceáil.
Don bhainistíocht is leor ceist shimplí do d'fhorbróirí nó do ghníomhaireacht: “An bpróiseálann ár bhfeidhmchlár sonraí sraitheaite áit ar bith a thagann ón taobh amuigh, agus má phróiseálann, conas a chosnaítear iad?” Is comhartha maith é freagra soiléir le háiteanna aimsithe. Is cúis é freagra seachantach chun an feidhmchlár a ligean a sheiceáil.
Conas a chabhraíonn PHP SOS go nithiúil?
- Cuardaímid do chód le haghaidh dí-shraithe le sonraí coimhthíocha agus measaimid gach fionnachtain de réir inrochtaineachta agus éifeacht.
- Molaimid aistrithe nithiúla go JSON nó glaonna cosanta agus tacaímid le d'fhorbróirí sa chur i bhfeidhm.
- Seiceálaimid spleáchais le haghaidh laigí aitheanta agus doiciméadaímid an staid.
- Ar iarratas, ligimid don fheidhmchlár a bheith seiceáilte go neamhspleách mar chuid d'iniúchadh slándála agus tástáil threáite.
Ceisteanna coitianta
An bhfuil unserialize() i PHP neamhshlán go bunúsach?
Níl, do shonraí nach gcruthaíonn ach d'fheidhmchlár féin agus nach féidir le haon duine a athrú. Éiríonn sé contúirteach a luaithe is féidir le húsáideoirí nó le tríú páirtithe tionchar a imirt ar an ionchur, mar shampla trí fhianáin, páirceanna foirme nó comhéadain sheachtracha.
An leor allowed_classes => false mar chosaint?
Cuireann sé cosc ar réada treallach a chruthú agus dúnann sé an príomhbhealach ionsaithe dá bhrí sin. Do ionchuir ón taobh amuigh is é JSON an rogha níos fearr mar sin féin, mar go bhfuil an parsálaí níos simplí agus nach n-athchruthaíonn sé réada.
An gcabhraíonn nuashonrú leabharlann in aghaidh ionsaithe dí-shraitheadaithe?
Go páirteach. Is minic a úsáideann ionsaithe aicmí ó spleáchais a ritheann gníomhartha nuair a scriostar réad nó nuair a dhúisítear é. Dúnann pacáistí reatha slabhraí aitheanta, ach is é an glao unserialize le sonraí coimhthíocha an fhíorchúis.
An bhfuil baint ag PHP2Shell le dí-shraitheadú?
Tá an dá phríomhleochaileacht i bpróiseáil iarratais PHP. Baineann an chomhairle faoi CVE-2026-115560, os a choinne sin, le cumraíocht neamhghnách de shraitheadú seisiún. Is é an réiteach ansin session.upload_progress.enabled=0.