PDO vaicājumu problēmas PHP
Kā jau vajadzētu zināt, SQL vaicājumi ir pakļauti SQL injekcijām. PDO paplašinājums ir radīts, lai cīnītos pret injekcijām, bet pēc noklusējuma tas to nedara.
Apskatīsim problēmu ar piemēru. Pieņemsim, ka mums ir šāds vaicājums, kurā tiek ievietots mainīgais:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
Pieņemsim, ka mūsu mainīgais nāk no kaut kurienes ārējā vidē, piemēram, no GET parametra. Vienkāršības labad, tomēr, iestatīsim tā vērtību manuāli. Mēs gaidām kādu skaitlisku vērtību, piemēram, šādu:
<?php
$id = 1;
?>
Ļaunprātīgs hakeris, tomēr, var nodot
šādu vērtību (pieņemsim, ka mums
ir lauks role):
<?php
$id = '-1 OR role="admin"';
?>
Izrādās, ka mēs gaidījām šādu vaicājumu:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
Bet saņēmām šādu, kas izvelk vietnes administratoru:
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
Lai izvairītos no šādas situācijas, PDO ir paredzēts īpašs mehānisms, ko sauc par sagatavotajiem vaicājumiem. Tos mēs apskatīsim nākamajā nodarbībā.
Ar nolūku veiciet SQL injekciju savā datu bāzē.