IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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.

Aktivity
Avatar
David
Člen
Avatar
David:22.1.2017 10:18

Zdravím, je tento způsob zápisu s použitím PDO zabezpečen proti SQL Injection ? Díky

<?php
if(isset($_POST['sent'])) {


        $sql = $spojeni->prepare("INSERT INTO user (nameUser, surnameUser, nickUser)
                                      VALUES (:nameUser, :surnameUser, :nickUser)");
        $sql->bindParam(':nameUser', $_POST['name_User']);
        $sql->bindParam(':surnameUser', $_POST['surname_User']);
        $sql->bindParam(':nickUser', $_POST['nick_User']);
        $sql->execute();
        }
?>
 
Odpovědět
22.1.2017 10:18
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na David
Jakub Žák:22.1.2017 10:33

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é).

Editováno 22.1.2017 10:34
Nahoru Odpovědět
22.1.2017 10:33
Kuba je ajťák. Buď jako Kuba.
Avatar
David
Člen
Avatar
Odpovídá na Jakub Žák
David:22.1.2017 11:27

Díky,
které způsoby útoku tato syntaxe neošetří ?

Editováno 22.1.2017 11:27
 
Nahoru Odpovědět
22.1.2017 11:27
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na David
Jakub Žák:22.1.2017 11:37

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áš...

Nahoru Odpovědět
22.1.2017 11:37
Kuba je ajťák. Buď jako Kuba.
Avatar
Odpovídá na David
Matúš Petrofčík:22.1.2017 12:22

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 ? :)

Editováno 22.1.2017 12:23
Nahoru Odpovědět
22.1.2017 12:22
obsah kocky = r^2 ... a preto vlak drnká
Avatar
David
Člen
Avatar
David:22.1.2017 13:31

Díky....určitě je to tak lepší,ale vzhledem k tomu,že jsem v zápisu již použil tyto názvy pro řádky v DB,tak jsem to chtěl odlišit.

A metoda escapování je také zabezpečená proti injection ne ? mysqli_real_es­cape_string

 
Nahoru Odpovědět
22.1.2017 13:31
Avatar
Odpovídá na David
Matúš Petrofčík:22.1.2017 13:35

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.

Editováno 22.1.2017 13:37
Nahoru Odpovědět
22.1.2017 13:35
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Odpovídá na Matúš Petrofčík
Matúš Petrofčík:22.1.2017 13:38

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). :)

Nahoru Odpovědět
22.1.2017 13:38
obsah kocky = r^2 ... a preto vlak drnká
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.