Problemer med forespørgsler i PDO i PHP
Som du allerede burde vide, er SQL-forespørgsler modtagelige for SQL-injektioner. PDO-udvidelsen er designet til at bekæmpe injektioner, men som standard gør den det ikke automatisk.
Lad os se på problemet med et eksempel. Antag, at vi har følgende forespørgsel, hvor en variabel indsættes:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
Lad os antage, at vores variabel kommer et sted fra udefra, for eksempel fra en GET-parameter. For enkelhedens skyld, lad os dog bare sætte dens værdi manuelt. Vi forventer en eller anden numerisk værdi, for eksempel denne:
<?php
$id = 1;
?>
En ondsindet hacker kan dog sende
følgende værdi (vi antager, at vi
har et felt role):
<?php
$id = '-1 OR role="admin"';
?>
Resultatet er, at vi ønskede følgende forespørgsel:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
Men fik følgende, som henter webstedets administrator:
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
For at undgå denne situation har PDO en speciel mekanisme, som kaldes forberedte forespørgsler. Dem vil vi se nærmere på i næste lektion.
Foretag med vilje en SQL-injektion mod din database.