Go achomair: Cuireann tú cosc ar CSRF i PHP trí éileamh go dtabharfadh gach iarratas a athraíonn rud comhartha rúnda leis atá ceangailte leis an seisiún, a seiceálann tú ar thaobh an fhreastalaí le hash_equals(). Ina theannta sin seiceálann tú na ceanntásca Origin nó Sec-Fetch-Site agus socraíonn tú fianáin seisiúin le SameSite. Ní ceart d'iarratais GET sonraí a athrú go deo, agus teastaíonn cosaint ón bhfoirm logála isteach freisin.
Cliceáil nach dtugann aon duine faoi deara
Tá fostaí logáilte isteach i gcúlra an tsiopa agus osclaíonn sí leathanach coimhthíoch i dara cluaisín. Seolann an leathanach sin foirm sa chúlra chuig an gcúlra, mar shampla chun seoladh ríomhphoist a athrú nó cuntas a chruthú. Cuireann an brabhsálaí an fhianán seisiúin leis go huathoibríoch. Don fheidhmchlár is cosúil an t-iarratas le gach iarratas eile ón bhfoireann féin.
Is é sin Cross-Site Request Forgery, CSRF go hachomair: iarratas a sheolann úsáideoir logáilte isteach gan fhios chuig feidhmchlár a bhfuil muinín aige as. Ní fheiceann an t-ionsaitheoir an freagra, ach níl sé de dhíth air. Is leor go ndéantar an gníomh.
Ní bhíonn CSRF i gceannlínte nuachta mar PHP2Shell, ach is toradh coitianta é i bhfeidhmchláir PHP a forbraíodh go hinmheánach. Tagann cosaint le frámaí ar nós Symfony agus Laravel; tagann laigí ann go príomha san áit ar cuireadh as feidhm é do bhealaí aonair. Is minic nach bhfuil aon chosaint ann in fhorbairtí féin gan fráma.
CSRF i PHP: cé na hiarratais ar gá iad a chosaint
Teastaíonn cosaint ó gach iarratas a athraíonn staid: sábháil, scriosadh, ordú, cearta a thabhairt, socruithe a athrú, comhaid a uaslódáil, logáil amach. Níl comhartha de dhíth ar ghlaonna léite, fad is nach léann siad ach i ndáiríre.
Leanann an chéad riail as sin: Gan athrú trí GET. Is féidir naisc ar nós loeschen.php?id=… a spreagadh go han-éasca ó leathanaigh choimhthíocha, mar shampla trí íomhá leabaithe. Is le POST, PUT, PATCH nó DELETE a bhaineann gníomhartha a athraíonn rud.
An dara riail: An logáil isteach a chosaint freisin. Sa CSRF logála isteach mar a thugtar air, logáiltear íospartach isteach gan fhios i gcuntas an ionsaitheora. Má chuireann sé sonraí íocaíochta nó doiciméid isteach ansin, críochnaíonn siad ag an ionsaitheoir. Cuireann comhartha san fhoirm logála isteach agus ID seisiúin nua tar éis logála isteach rathúil cosc air sin.
An patrún comhartha sioncronaithe i PHP
Do ghnáthfheidhmchláir le seisiúin, molann OWASP an patrún comhartha sioncronaithe: gineann an freastalaí comhartha randamach, stórálann sé sa seisiún é agus tá sé ag súil leis ar ais i ngach foirm a athraíonn rud. Tá sé tábhachtach go seoltar an comhartha san fhoirm nó i gceanntásc dá chuid féin, ní i bhfianán.
<?php
declare(strict_types=1);
function csrfToken(): string
{
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
return $_SESSION['csrf_token'];
}
function csrfPruefen(): void
{
$gesendet = $_POST['csrf_token'] ?? $_SERVER['HTTP_X_CSRF_TOKEN'] ?? '';
if (!is_string($gesendet) || !hash_equals(csrfToken(), $gesendet)) {
http_response_code(403);
exit('Anfrage abgelehnt.');
}
}
if ($_SERVER['REQUEST_METHOD'] !== 'GET') {
csrfPruefen();
}
?>
<form method="post" action="/konto/email">
<input type="hidden" name="csrf_token"
value="<?= htmlspecialchars(csrfToken(), ENT_QUOTES, 'UTF-8') ?>">
<!-- tuilleadh réimsí -->
</form>
Déanann hash_equals() comparáid in am seasta, ionas nach nochtann an t-am freagartha aon rud faoin luach ceart. Tar éis logáil isteach, ba cheart duit an ID seisiúin a athnuachan le session_regenerate_id(true) agus comhartha nua a ghiniúint. Míníonn Uimhreacha randamacha slána agus comharthaí i PHP cén fáth gurb é random_bytes() an fhoinse cheart agus cé na feidhmeanna nach bhfuil oiriúnach.
Is leor comhartha amháin do gach seisiún don chuid is mó d'fheidhmchláir. Méadaíonn comharthaí do gach foirm nó do gach iarratas an chosaint beagán, ach cruthaíonn siad fadhbanna le roinnt cluaisíní oscailte agus leis an gcnaipe ar ais. Is tábhachtaí ná minicíocht an athraithe nach bhfeictear an comhartha riamh in URLanna, áit a bhféadfadh sé críochnú i logaí, i stair an bhrabhsálaí agus i dtagairtí Referrer chuig leathanaigh choimhthíocha.
Do chláir gan staid agus gan seisiún, luann OWASP mar mhalairt an fhianán sínithe double-submit: comhartha atá ceangailte leis an seisiún trí HMAC. Ní mholtar go sainráite an leagan simplí gan síniú.
An dara sraith: Origin, Sec-Fetch-Site agus SameSite
Seolann brabhsálaithe nua-aimseartha eolas faoina mbunús le hiarratais. Ainmníonn an ceanntásc Origin an leathanach glaonna, insíonn Sec-Fetch-Site an dtagann an t-iarratas ón leathanach céanna (same-origin), ó cheann gaolmhar (same-site) nó ó cheann coimhthíoch (cross-site). As sin is féidir seiceáil bhreise shimplí a thógáil:
<?php
$erlaubteHerkunft = 'https://www.example.de';
$fetchSite = $_SERVER['HTTP_SEC_FETCH_SITE'] ?? null;
$origin = $_SERVER['HTTP_ORIGIN'] ?? null;
$verdaechtig = ($fetchSite !== null && $fetchSite !== 'same-origin')
|| ($fetchSite === null && $origin !== null && $origin !== $erlaubteHerkunft);
if ($_SERVER['REQUEST_METHOD'] !== 'GET' && $verdaechtig) {
http_response_code(403);
exit;
}
Leagann OWASP béim ar dhá phointe anseo: ní mór an bunús a chur i gcomparáid go hiomlán ionas nach sleamhnaíonn fearainn atá cosúil ina chéile tríd, agus ní ceart do cheanntásc atá ar iarraidh ná don luach null bunús féin a áireamh. Toisc nach seolann brabhsálaithe níos sine na ceanntásca i gcónaí, is é an comhartha an príomhchosaint fós.
Is é an tríú sraith fianáin seisiúin le SameSite. Tacaíonn PHP le session.cookie_samesite ó leagan 7.3, is folamh an luach réamhshocraithe. Socraigh Lax ar a laghad; do chúlraí íon is minic gur féidir Strict a úsáid. Déanann an treoir Seisiúin i PHP a chosaint cur síos ar na socruithe fianán eile.
Má úsáideann tú CMS, tagann uirlisí dá chuid féin leis de ghnáth. Oibríonn WordPress, mar shampla, le nonces mar a thugtar orthu, a chuireann forlíontáin isteach trí fheidhmeanna ar nós wp_nonce_field() agus check_admin_referer(). Sa chleachtas tagann laigí chun cinn go príomha i bhforlíontáin a ligeann seiceálacha den sórt sin i ndearmad do ghníomhartha aonair. Seiceáil go háirithe forlíontáin a scríobh tú féin nó atá neamhchoitianta.
I gcás comhéadan a úsáideann brabhsálaithe ó fhearainn eile, cinneann cumraíocht CORS freisin. Má thugann an freastalaí gach bunús atá ag iarraidh ar ais mar cheadaithe agus má cheadaíonn sé fianáin ag an am céanna, cuireann sé cosaint an bhrabhsálaí féin as feidhm. Molann OWASP CORS a oscailt do bhunúsanna a bhfuil muinín shainráite iontu amháin; bíonn faomhadh ginearálta do gach fo-fhearann ina fhadhb chomh luath agus a thiteann ceann acu i lámha coimhthíocha.
Liosta seiceála d'fheidhmchláir atá ann cheana
I dtionscadail atá tagtha chun cinn go nádúrtha, cabhraíonn athbhreithniú córasach:
- Gach bealach agus script a athraíonn sonraí a thaifeadadh, pointí deiridh Ajax agus uaslódálacha comhad san áireamh.
- Seiceáil an úsáidtear GET dóibh, agus aistrigh go POST nó modhanna cuí.
- Do gach bealach a athraíonn rud, cruthaigh go seiceáiltear comhartha; eisceachtaí sa fhráma a lorg go sonrach.
- Logáil isteach, logáil amach agus athrú pasfhocail a thástáil ar leithligh.
session.cookie_samesiteagus seiceáil bunúis a chur leis.- Laigí XSS a cheartú, mar is féidir le cód a chuirtear isteach gach comhartha a léamh. Déanann Cross-Site-Scripting a chosc i PHP cur síos ar an gcur chuige.
Tá cosaint CSRF nach seiceáiltear ach sa tosach le JavaScript gan éifeacht. Ní mór an tseiceáil a dhéanamh ar an bhfreastalaí sula ndéantar an gníomh.
Conas a chabhraíonn PHP SOS go nithiúil?
- Taifeadaimid gach bealach de d'fheidhmchlár PHP a athraíonn rud agus seiceálaimid cá bhfuil comhartha ar iarraidh nó curtha as feidhm.
- Cuirimid pointe seiceála lárnach isteach in ionad seiceálacha comharthaí a scaipeadh ar go leor scripteanna.
- Cuirimid seiceáil bunúis agus socruithe SameSite leis, gan cur isteach ar phróisis íocaíochta nó logála isteach.
- Déanaimid tástáil arís tar éis an aistrithe agus doiciméadaímid na torthaí.
Déanann an tseirbhís Iniúchadh slándála agus tástáil threáite cur síos ar sheiceáil iomlán de d'fheidhmchlár.
Ceisteanna coitianta
An leor SameSite=Lax mar chosaint CSRF?
Ní leor. De réir OWASP is sraith bhreise iad fianáin SameSite, ní hionadach. Seolann Lax fianáin fós le gnáthghlaonna leathanaigh trí GET, agus ní chlúdaítear ionsaithe ó fho-fhearainn den suíomh céanna.
An bhfuil comhartha CSRF de dhíth ar APInna JSON?
Má dhéanann an API fíordheimhniú le fianáin, tá, nó seiceáil choibhéiseach. Mar mhalairt tá ceanntásca iarratais dá gcuid féin, nach gceadaíonn brabhsálaithe ar shuíomhanna coimhthíocha ach tar éis réamhsheiceáil CORS. Ach ansin ní ceart d'fhaomhadh CORS ach bunúsanna a bhfuil muinín shainráite iontu a chuimsiú.
An gcaithfear an fhoirm logála isteach a chosaint freisin?
Is gá. I gcás CSRF logála isteach, logáiltear íospartach isteach i gcuntas coimhthíoch gan fhios dó agus cuireann sé a shonraí féin isteach ann. Cuireann comhartha san fhoirm logála isteach agus seisiún nua tar éis logála isteach cosc air sin.
An gcosnaíonn cosaint CSRF i gcoinne XSS freisin?
Is é a mhalairt: cuireann leochaileacht XSS gach cosaint CSRF as feidhm, mar is féidir le cód a chuirtear isteach comharthaí bailí a léamh agus a sheoladh in ainm an leathanaigh. Caithfear an dá laige a cheartú ar leithligh.