Problemer med spørringer i PDO i PHP
Som du allerede bør vite, er SQL-spørringer utsatt for SQL-injeksjoner. PDO-utvidelsen er designet for å bekjempe injeksjoner, men bare sånn, som standard, gjør den ikke dette automatisk.
La oss se på problemet med et eksempel. Anta at vi har følgende spørring, der en variabel settes inn:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
Anta at variabelen vår kommer et sted fra utsiden, for eksempel fra en GET-parameter. For enkelthetens skyld, la oss likevel bare sette verdien manuelt. Vi forventer en numerisk verdi, for eksempel slik:
<?php
$id = 1;
?>
En ondsinnet hacker kan derimot sende
følgende verdi (vi antar at vi har
et felt role):
<?php
$id = '-1 OR role="admin"';
?>
Resultatet blir at vi ønsket følgende spørring:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
Men fikk følgende, som henter nettsidens administrator:
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
For å unngå en slik situasjon, har PDO et spesielt mekanisme, som kalles forberedte spørringer. Disse skal vi gå gjennom i neste leksjon.
Utfør med vilje en SQL-injeksjon mot databasen din.