Fil-qosor: CSRF f'PHP tevitawh billi kull talba li tibdel xi ħaġa trid iġġib magħha token sigriet, marbut mas-sessjoni, li tivverifikaw fuq in-naħa tas-server b'hash_equals(). Barra minn hekk tivverifikaw l-headers Origin jew Sec-Fetch-Site u tissettjaw cookies tas-sessjoni b'SameSite. Talbiet GET qatt m'għandhom ibiddlu data, u l-formola tal-login teħtieġ ukoll protezzjoni.
Klikk li ħadd ma jinduna bih
Impjegata hija mdaħħla fil-backend tal-ħanut u tiftaħ fit-tieni tab paġna barranija. Din il-paġna tibgħat fl-isfond formola lill-backend, pereżempju biex tibdel indirizz tal-posta jew toħloq kont. Il-browser jehmeż il-cookie tas-sessjoni awtomatikament. Għall-applikazzjoni t-talba tidher bħal kull waħda oħra mit-tim proprju.
Dan huwa Cross-Site Request Forgery, fil-qosor CSRF: talba li utent imdaħħal jibgħat lil applikazzjoni li jafdaha mingħajr ma jaf. L-attakkant ma jarax it-tweġiba, imma lanqas ma jeħtieġha. Biżżejjed li l-azzjoni titwettaq.
CSRF ma jidhirx fl-aħbarijiet bħal PHP2Shell, imma f'applikazzjonijiet PHP żviluppati internament huwa sejba frekwenti. Frameworks bħal Symfony u Laravel jiġu b'protezzjoni; id-dgħufijiet jinħolqu hemmhekk l-aktar fejn ġiet mitfija għal rotot individwali. Żviluppi proprji mingħajr framework spiss ma jkollhomx waħda xejn.
CSRF f'PHP: liema talbiet iridu jiġu protetti
Protezzjoni jeħtieġu t-talbiet kollha li jibdlu stat: ħażna, tħassir, ordnijiet, għoti ta' drittijiet, bidla tal-issettjar, upload ta' fajls, logout. Sejħiet li jaqraw biss ma jeħtieġu l-ebda token, sakemm veru jaqraw biss.
Minn hawn jiġi l-ewwel regola: L-ebda bidla b'GET. Links bħal loeschen.php?id=… jistgħu jiġu attivati minn paġni barranin partikolarment faċilment, pereżempju permezz ta' immaġni inkorporata. Azzjonijiet li jibdlu jappartjenu f'POST, PUT, PATCH jew DELETE.
It-tieni regola: Ipproteġu wkoll il-login. Fl-hekk imsejjaħ login CSRF vittma tiddaħħal mingħajr ma tinduna f'kont tal-attakkant. Jekk tidħol hemmhekk data ta' ħlas jew dokumenti, dawn jispiċċaw għand l-attakkant. Token fil-formola tal-login u ID ġdid tas-sessjoni wara login b'suċċess jevitaw dan.
Il-mudell Synchronizer Token f'PHP
Għal applikazzjonijiet klassiċi b'sessjonijiet OWASP jirrakkomanda l-mudell Synchronizer Token: is-server joħloq token każwali, jaħżnu fis-sessjoni u jistennieh lura f'kull formola li tibdel. Importanti li t-token jintbagħat fil-formola jew f'header separat, mhux f'cookie.
<?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') ?>">
<!-- aktar oqsma -->
</form>
hash_equals() iqabbel f'ħin kostanti, b'tali mod li l-ħin tat-tweġiba ma jiżvelax xejn dwar il-valur korrett. Wara l-login għandkom tiġġeddu l-ID tas-sessjoni b'session_regenerate_id(true) u toħolqu token ġdid. Għaliex random_bytes() hija s-sors it-tajjeb u liema funzjonijiet mhumiex adattati jispjegah Numri każwali u tokens sikuri f'PHP.
Token wieħed għal kull sessjoni huwa biżżejjed għall-biċċa l-kbira tal-applikazzjonijiet. Tokens għal kull formola jew għal kull talba jżidu ftit il-protezzjoni, imma jwasslu għal problemi b'diversi tabs miftuħa u bil-buttuna lura. Aktar importanti mill-frekwenza tal-bidla hu li t-token qatt ma jidher f'URLs, fejn jista' jispiċċa f'logs, fl-istorja tal-browser u fi tagħrif ta' referrer lil paġni barranin.
Għal applikazzjonijiet mingħajr stat u bla sessjoni OWASP isemmi bħala alternattiva d-double-submit cookie iffirmat: token marbut mas-sessjoni b'HMAC. Il-verżjoni sempliċi, mhux iffirmata, espliċitament mhijiex rakkomandata.
It-tieni saff: Origin, Sec-Fetch-Site u SameSite
Browsers moderni jibagħtu mat-talbiet tagħrif dwar l-oriġini tagħhom. L-header Origin isemmi l-paġna li ssejjaħ, Sec-Fetch-Site jgħid jekk it-talba tiġix mill-istess paġna (same-origin), minn waħda relatata (same-site) jew minn waħda barranija (cross-site). Minn dan jista' jinbena verifika addizzjonali sempliċi:
<?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;
}
OWASP jisħaq hawnhekk fuq żewġ punti: l-oriġini trid tiġi mqabbla kompletament, biex domains li jinstemgħu simili ma jgħaddux, u header nieqes jew il-valur null ma jistax jitqies bħala oriġini proprja. Peress li browsers aktar qodma mhux dejjem jibagħtu l-headers, it-token jibqa' d-difiża ewlenija.
It-tielet saff huma cookies tas-sessjoni b'SameSite. PHP jappoġġja session.cookie_samesite mill-verżjoni 7.3, il-valur awtomatiku huwa vojt. Issettjaw mill-inqas Lax, għal backends puri spiss Strict huwa possibbli. L-issettjar l-ieħor tal-cookies jiddeskrivih il-gwida Ipproteġi s-sessjonijiet f'PHP.
Jekk tużaw CMS, ġeneralment iġib għodod proprji. WordPress, pereżempju, jaħdem b'hekk imsejħa nonces, li l-plugins jintegraw permezz ta' funzjonijiet bħal wp_nonce_field() u check_admin_referer(). Id-dgħufijiet fil-prattika jinħolqu l-aktar fl-estensjonijiet li jinsew dawn il-verifiki f'azzjonijiet individwali. Għalhekk ivverifikaw partikolarment plugins miktuba internament jew li mhumiex mifruxa.
Għal interfaces li browsers jużaw minn domains oħra, tiddeċiedi barra minn hekk il-konfigurazzjoni CORS. Jekk is-server jirritorna kull oriġini li titlob bħala permessa u fl-istess ħin jippermetti cookies, huwa stess ineħħi l-protezzjoni tal-browser. OWASP jirrakkomanda li CORS jinfetaħ biss għal oriġini espliċitament affidabbli; permess ġenerali għas-subdomains kollha jsir problema malli waħda minnhom taqa' f'idejn barranin.
Checklist għal applikazzjonijiet eżistenti
Fi proġetti li kibru jgħin eżami sistematiku:
- Irreġistraw ir-rotot u l-iskripts kollha li jibdlu data, inklużi endpoints Ajax u uploads ta' fajls.
- Ivverifikaw jekk għal dawn jintuża GET, u biddluh għal POST jew metodi adattati.
- Għal kull rotta li tibdel ippruvaw li t-token jiġi vverifikat; fittxu b'mod mirat eċċezzjonijiet fil-framework.
- Ittestjaw separatament login, logout u bidla tal-password.
- Żidu
session.cookie_samesiteu l-verifika tal-oriġini. - Irranġaw vulnerabbiltajiet XSS, għax kodiċi daħħal bil-moħbi jista' jaqra kull token. Il-proċedura tiddeskriviha Evita Cross-Site Scripting f'PHP.
Protezzjoni CSRF li tiġi vverifikata biss fil-frontend b'JavaScript hija bla effett. Il-verifika trid issir fuq is-server, qabel ma titwettaq l-azzjoni.
Kif tgħin PHP SOS b'mod konkret?
- Nirreġistraw ir-rotot kollha li jibdlu fl-applikazzjoni PHP tagħkom u nivverifikaw fejn token jonqos jew ġie mitfi.
- Nibnu punt ċentrali ta' verifika, minflok ma nqassmu l-verifiki tat-token fuq ħafna skripts.
- Nissupplimentaw il-verifika tal-oriġini u l-issettjar ta' SameSite, mingħajr ma nfixklu proċessi ta' ħlas jew ta' login.
- Nittestjaw mill-ġdid wara l-bidla u niddokumentaw ir-riżultati.
Verifika kompluta tal-applikazzjoni tagħkom tiddeskriviha s-servizz Awditu tas-sigurtà u test ta' penetrazzjoni.
Mistoqsijiet frekwenti
SameSite=Lax huwa biżżejjed bħala protezzjoni CSRF?
Le. Cookies SameSite huma, skont OWASP, saff addizzjonali, mhux sostituzzjoni. Lax xorta jibgħat cookies fi tfittxijiet normali tal-paġni b'GET, u attakki minn subdomains tal-istess websajt ma jiġux koperti.
APIs JSON jeħtieġu token CSRF?
Jekk l-API tawtentika b'cookies, iva jew verifika ekwivalenti. Alternattiva huma headers proprji tat-talba, li l-browsers jippermettu minn paġni barranin biss wara verifika preliminari CORS. Imbagħad, madankollu, il-permess CORS jista' jinkludi biss oriġini espliċitament affidabbli.
Il-formola tal-login trid tkun protetta wkoll?
Iva. Fil-login CSRF vittma tidħol mingħajr ma tinduna f'kont barrani u hemmhekk tidħol data proprja. Token fil-formola tal-login u sessjoni ġdida wara l-login jevitaw dan.
Protezzjoni CSRF tipproteġi wkoll minn XSS?
Bil-maqlub: vulnerabbiltà XSS tneħħi kull protezzjoni CSRF, għax kodiċi daħħal bil-moħbi jista' f'isem il-paġna jaqra tokens validi u jibgħathom magħhom. Iż-żewġ dgħufijiet iridu jiġu rranġati separatament.