Sitwazzjoni attwali: PHP2Shell. Żewġ vulnerabbiltajiet kritiċi ta' PHP (CVSS 9,2) jippermettu kodiċi malizzjuż mingħajr login. Patches mill-21/10/2026.X'għandu jsir issa →

Protezzjoni CSRF f'applikazzjonijiet PHP

Kif l-iżviluppaturi jevitaw Cross-Site Request Forgery f'applikazzjonijiet PHP: tokens għal kull talba li tibdel xi ħaġa, verifika tal-oriġini fl-header u cookies SameSite bħala saff addizzjonali.

Stat 6 min. qariŻvilupp sigur

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:

  1. Irreġistraw ir-rotot u l-iskripts kollha li jibdlu data, inklużi endpoints Ajax u uploads ta' fajls.
  2. Ivverifikaw jekk għal dawn jintuża GET, u biddluh għal POST jew metodi adattati.
  3. Għal kull rotta li tibdel ippruvaw li t-token jiġi vverifikat; fittxu b'mod mirat eċċezzjonijiet fil-framework.
  4. Ittestjaw separatament login, logout u bidla tal-password.
  5. Żidu session.cookie_samesite u l-verifika tal-oriġini.
  6. 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.
Importanti

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.

Sorsi

Kuntatt immedjat

Kull siegħa tgħodd. Iktbu lilna issa.

Iddeskrivu fil-qosor is-sistema, il-verżjoni ta' PHP u dak li osservajtu. Nikkuntattjawkom, niċċaraw is-sitwazzjoni u naħdmu mill-bogħod sakemm l-inċident jingħalaq u jiġi ddokumentat.

Għajnuna immedjata