Diskuze: Bezpečná syntaxe PDO proti SQL Injection
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 8 zpráv z 8.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Ano, mělo by to být OK (ale ošetří to opravdu jen SQL injection, ostatní věci doporučuji ošetřovat před tím a dát si to z POST do nějaké proměnné).
Díky,
které způsoby útoku tato syntaxe neošetří ?
Tak třeba jestli je to opravdu vyplněný, jestli tam nejsou nějaký schovaný nebezpečný odkazy, skripty, jestli je nick v použitelném tvaru apod., podle toho, co s těmi daty dál děláš...
V zásade to máš fajn, prakticky môžeš pridať parametre aj naraz v execute:
$sql = $spojeni->prepare("INSERT INTO user (nameUser, surnameUser, nickUser) VALUES (:nameUser, :surnameUser, :nickUser)");
$sql->execute([
':nameUser' => $nameUser,
':surnameUser' => $surnameUser,
':nickUser' => $nickUser,
]);
Ako si si už mohol všimnúť, tak som nepoužil priamo $_POST, ale konkrétne premenné. Bolo by fajn skontrolovať, či v daných premenných z formuláru sú požadované hodnoty (napr. nick aby mal len povolené znaky, a minimálne 3 znaky...), a môžeš ošetriť biele znaky pred a po texte (funkcia trim(), napr. ak máš nick " matusko ", tak tie medzery pred a po odstráni). Taktiež sa môže stať, že daný kľúč v $_POST nebude existovať (napr. niekto upraví pred odoslaním formulár). A podobne.
SQL injection pri takomto použití by ale nastať nemala. PDO je tak navrhnuté a ak sa používa správne, nič by sa nemalo stať.
PS: nie je lepšia konvencia nazývať premenné $userName, $userSurname, $userNickname ?
Pri používaní PDO ju netreba používať. Tá funkcia je vhodná pri používaní mysqli funkcií.
Pri výpise z DB ti ale treba ošetriť XSS, teda escapovať html znaky.
<?php echo htmlspecialchars($string, ENT_QUOTES); ?>
prípadne
<?php echo htmlentities($string, ENT_QUOTES); // ešte bezpečnejšie ?>
//edit: A myslím že v DB je vhodné nechávať texty neupravené, tak ako ich zadal užívateľ. Prípadná ochrana sa robí pri výpise, tak ako som napísal v kóde vyššie.
A myslím že v DB je vhodné nechávať texty neupravené, tak ako ich zadal užívateľ. Prípadná ochrana sa robí pri výpise, tak ako som napísal v kóde vyššie.
Výnimkou je odstránenie nežiadúcich znakov (napr. biele znaky pred a za textom).
Zobrazeno 8 zpráv z 8.