Fil-qosor: PHP taċċessa databases permezz ta' żewġ interfaces mifruxa: PDO (PHP Data Objects) jaħdem ma' ħafna sistemi ta' databases permezz ta' interface uniformi, mysqli huwa mfassal għal MySQL u MariaDB. Ma' tnejn minnhom, il-prepared statements, jiġifieri mistoqsijiet bi placeholders, jipproteġu b'mod affidabbli minn SQL injection. Minn PHP 8.0 (PDO) rispettivament 8.1 (mysqli) it-tnejn jirrapportaw l-iżbalji bħala exception b'mod predefinit.
Kif PHP titkellem mad-databases
Kważi kull applikazzjoni PHP taħżen il-kontenut tagħha f'database: paġni, ordnijiet, kontijiet tal-utenti, settings. L-iskrip PHP jistabbilixxi għal dan konnessjoni, jibgħat mistoqsija fil-lingwa SQL u jipproċessa r-riżultat. L-aċċessi normalment jinsabu f'fajl tal-konfigurazzjoni fuq l-istess server.
Għall-maniġment dan huwa importanti, għax id-database normalment fiha d-dejta l-aktar prezzjuża tal-kumpanija. Min jista' jesegwixxi kodiċi fuq is-server tal-web, bħala regola jista' jaqra wkoll il-fajl tal-konfigurazzjoni u b'dawn l-aċċessi jaċċessa d-database.
PDO u mysqli imqabbla
| Karatteristika | PDO | mysqli |
|---|---|---|
| Databases | ħafna, permezz ta' drivers bħal PDO_MYSQL, PDO_PGSQL, PDO_SQLITE, PDO_SQLSRV, PDO_OCI |
MySQL u MariaDB |
| Placeholders | msemmija (:name) u posizzjonali (?) |
posizzjonali (?) |
| Stil | orjentat lejn l-oġġetti | orjentat lejn l-oġġetti u proċedurali |
| Żbalji bħala exception | standard minn PHP 8.0.0 | standard minn PHP 8.1.0 |
| Forma qasira għal mistoqsijiet bi parametri | prepare() u execute() b'array |
execute_query() minn PHP 8.2.0 |
Fil-prattika spiss jiddeċiedi l-framework jew iċ-CMS. Ħafna jġibu saff proprju tad-database li ġewwa juża PDO jew mysqli. Min jieħu applikazzjoni jista' b'tiftix sempliċi fil-kodiċi sors jistabbilixxi liema interface qed tintuża u fejn jinħolqu l-mistoqsijiet:
# Fejn l-applikazzjoni tistabbilixxi konnessjonijiet, fejn jinħolqu l-mistoqsijiet?
grep -rn --include='*.php' -E 'new PDO|new mysqli|mysqli_connect|->query\(' /var/www/app/src | head -50
Postijiet misjuba b'->query( mhumiex awtomatikament mhux sikuri. Imma jixirqilhom ħarsa oħra, għax hemmhekk il-valuri jistgħu jidħlu direttament fit-test SQL, minflok ma jiġu mgħoddija permezz ta' placeholders. Proġetti eqdem speċjalment jaħلطu ż-żewġ stili, u l-verifika tħallas qabel kull aġġornament ikbar.
Prepared statements: l-aktar mudell importanti
F'prepared statement il-mistoqsija tintbagħat lid-database bi placeholders u l-valuri jiġu mgħoddija separatament. Skont il-manwal ta' PHP, dan jipproteġi minn SQL injection jekk l-inputs kollha tal-utent jgħaddu minn placeholders.
<?php
declare(strict_types=1);
$pdo = new PDO(
'mysql:host=localhost;dbname=shop;charset=utf8mb4',
$dbUser,
$dbPass,
[PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]
);
$stmt = $pdo->prepare('SELECT id, name FROM kunden WHERE plz = :plz AND aktiv = :aktiv');
$stmt->execute(['plz' => $plz, 'aktiv' => 1]);
foreach ($stmt as $zeile) {
echo htmlspecialchars($zeile['name'], ENT_QUOTES, 'UTF-8'), "\n";
}
L-istess ħaġa b'mysqli fil-forma qasira li teżisti minn PHP 8.2:
<?php
$db = new mysqli('localhost', $dbUser, $dbPass, 'shop');
$ergebnis = $db->execute_query('SELECT id, name FROM kunden WHERE plz = ?', [$plz]);
foreach ($ergebnis as $zeile) {
echo htmlspecialchars($zeile['name'], ENT_QUOTES, 'UTF-8'), "\n";
}
L-iżviluppaturi għandhom jaf żewġ limiti. Il-placeholders m'għandhomx jitpoġġew bejn l-ilsiera; fi tfittxijiet LIKE il-karattri ta' placeholder % jappartjenu fil-valur mgħoddi. U l-placeholders jissostitwixxu biss valuri, mhux ismijiet ta' tabelli jew kolonni. Kif dawn il-każijiet speċjali jissolvew b'mod sigur turi l-gwida Kif tipprevjenu SQL injection f'PHP.
Trattament tal-iżbalji: exceptions minflok żbalji silenzjużi
Qabel, iż-żewġ interfaces kienu jaħdmu b'mod silenzjuż b'mod predefinit: mistoqsija falluta kienet tirritorna false, u min ma kkontrollax dan kompla jaħdem b'dejta vojta. Dan inbidel:
- PDO: Minn PHP 8.0.0
PDO::ERRMODE_EXCEPTIONhuwa l-istandard. L-iżbalji jitfgħuPDOException. - mysqli: Minn PHP 8.1.0 ir-rapportar huwa ssettjat fuq
MYSQLI_REPORT_ERRORuMYSQLI_REPORT_STRICT. L-iżbalji jitfgħumysqli_sql_exception; qabel ir-rapportar kien mitfi.
Għas-sigurtà dan ifisser: l-exceptions iridu jinqabdu u jiġu rreġistrati, imma qatt ma għandhom jispiċċaw fil-browser bit-test SQL, ismijiet ta' tabelli jew aċċessi. Kif dan jinfired b'mod nadif tiddeskrivi l-paġna Żbalji u exceptions f'PHP.
L-aċċessi u d-drittijiet jinħarġu sew
Id-database hija mħarsa biss daqs l-aċċessi tagħha. Dawn ir-regoli ġew ittestjati:
- Utent proprju għal kull applikazzjoni: Qatt tużaw l-amministratur tad-database għall-websajt.
- Biss id-drittijiet meħtieġa: Websajt normalment teħtieġ qari, kitba, bidla u tħassir fid-database proprja tagħha, imma ebda drittijiet fuq databases oħra jew funzjonijiet tas-server.
- Ebda konnessjoni mill-bogħod mingħajr raġuni: Id-database għandha tintlaħaq biss mis-server tal-web, mhux mill-internet.
- Aċċessi barra mill-webroot: Fajls tal-konfigurazzjoni u
.envm'għandhomx ikunu jistgħu jintalbu permezz ta' URL. Aktar dwar dan fl-artikolu Ħarsien tal-aċċessi u tal-fajls .env. - Konnessjoni ċċifrata b'servers separati: Jekk id-database tinsab fuq magna oħra, il-konnessjoni għandha taħdem ċċifrata, biex l-aċċessi u l-kontenut ma jgħaddux fix-xibka bħala test ċar.
- Aċċessi proprji għall-manutenzjoni: Backup, evalwazzjonijiet u amministraturi jirċievu utenti proprji. B'hekk fil-log jista' jiġi segwit min għamel xiex, u aċċess jista' jiġi msakkar mingħajr ma tiġi disturbata l-websajt.
Databases, PHP2Shell u l-każ serju
PHP2Shell ma tolqotx id-database nnifisha, imma l-interpretatur ta' PHP: CVE-2026-109618 u CVE-2026-109619 jippermettu l-eżekuzzjoni ta' kodiċi malizzjuż mingħajr login. Jekk jirnexxi, il-kodiċi jaħdem bid-drittijiet tal-proċess ta' PHP u b'hekk bħala regola jista' jaqra l-fajl tal-konfigurazzjoni bl-aċċessi tad-database. Il-prepared statements ma jgħinux kontra dan, għax l-attakk ma jgħaddix minn mistoqsija SQL.
Obbligatorju għalhekk huwa l-aġġornament għal PHP 8.5.12, 8.4.27, 8.3.36 jew 8.2.35 u r-restart tal-proċessi kollha ta' PHP. Jekk hemm indikazzjonijiet ta' attakk b'suċċess, jappartjenu aċċessi ġodda tad-database, verifika tad-database għal kontenut injettat u valutazzjoni tal-obbligu ta' notifika skont il-GDPR. Hawnhekk Incident Response strutturata tagħmel sens.
Ibdlu l-passwords tad-database biss wara t-tindif tas-server. Sakemm jaħdem kodiċi malizzjuż, jista' jaqra mill-ġdid ukoll aċċessi ġodda.
Kif jgħin PHP SOS konkretament?
- Neżaminaw kif l-applikazzjoni tagħkom taċċessa d-database, u jekk l-utenti, id-drittijiet u l-aċċess tan-netwerk jaqblux mal-minimu.
- Nikkontrollaw jekk il-fajls tal-konfigurazzjoni u tal-aċċessi jinsabux barra mill-webroot u ma jintlaħqux pubblikament.
- Wara inċident niġġeddu l-aċċessi fl-ordni t-tajba u nivverifikaw id-database għal kodiċi injettat.
- Niddokumentaw ir-riżultati b'mod li l-uffiċjali tal-protezzjoni tad-data u l-assiguraturi jkunu jistgħu jsegwuhom.
Mistoqsijiet frekwenti
Għandi nuża PDO jew mysqli?
Għal proġetti ġodda PDO spiss ikun l-għażla aktar flessibbli, għax jaħdem ma' ħafna databases permezz tal-istess interface. mysqli jagħmel sens jekk tużaw esklussivament MySQL jew MariaDB u teħtieġu l-funzjonijiet speċjali tagħhom. It-tnejn huma siguri jekk il-prepared statements jintużaw b'mod konsistenti.
PDO jitfa' awtomatikament exceptions meta jkun hemm żbalji?
Iva, minn PHP 8.0.0 PDO::ERRMODE_EXCEPTION huwa l-istandard. Qabel kien il-modalità silenzjuża, li fiha l-iżbalji setgħu jinkisbu biss permezz ta' errorCode() u errorInfo(). Applikazzjonijiet eqdem spiss għadhom jissettjaw il-modalità espliċitament.
Placeholders jistgħu jissostitwixxu wkoll ismijiet ta' tabelli jew kolonni?
Le. Il-placeholders jirrappreżentaw valuri biss. Ismijiet ta' tabelli u kolonni, pereżempju għal ordni, iridu jiġu vverifikati kontra lista fissa ta' ismijiet permessi qabel ma jiddaħħlu fil-mistoqsija.
Wara PHP2Shell irrid nibdel il-password tad-database?
L-aġġornament waħdu ma jitlobx dan. Imma jekk hemm indikazzjonijiet li s-server kien kompromess, l-aċċessi kollha fil-fajls tal-konfigurazzjoni jitqiesu magħrufa. Allura għandkom tiġġedduhom wara t-tindif.