Problem med PDO-förfrågningar i PHP
Som du redan borde veta är SQL-förfrågningar sårbara för SQL-injektioner. PDO-tillägget är designat för att bekämpa injektioner, men så här, som standard, gör det inte det automatiskt.
Låt oss titta på problemet med ett exempel. Anta att vi har följande förfrågan, där en variabel sätts in:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
Anta att vår variabel kommer utifrån, till exempel från en GET-parameter. För enkelhetens skull, låt oss dock bara sätta dess värde manuellt. Vi förväntar oss ett numeriskt värde, till exempel så här:
<?php
$id = 1;
?>
En elak hackare kan dock skicka
följande värde (vi antar att vi har
ett fält role):
<?php
$id = '-1 OR role="admin"';
?>
Resultatet blir att vi ville ha följande förfrågan:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
Men fick följande, som hämtar webbplatsens administratör:
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
För att undvika denna situation har PDO en speciell mekanism, som kallas förberedda förfrågningar. Dem kommer vi att gå igenom i nästa lektion.
Utför avsiktligt en SQL-injektion mot din databas.