Masalah Kueri di PDO PHP
Seperti yang sudah Anda ketahui, kueri SQL rentan terhadap SQL injection. Ekstensi PDO dirancang untuk melawan injeksi, tetapi secara default, begitu saja, ekstensi ini tidak melakukannya.
Mari kita lihat masalahnya dengan contoh. Misalkan kita memiliki kueri berikut, di mana variabel disisipkan:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
Misalkan variabel kita datang dari luar, contohnya, dari parameter GET. Untuk kesederhanaan, mari kita tentukan nilainya secara manual. Kita mengharapkan nilai numerik tertentu, misalnya seperti ini:
<?php
$id = 1;
?>
Namun, seorang peretas jahat dapat mengirimkan
nilai berikut (anggap kita memiliki
kolom role):
<?php
$id = '-1 OR role="admin"';
?>
Jadi, kita menginginkan kueri berikut:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
Tapi malah mendapatkan kueri berikut, yang mengambil data administrator situs:
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
Untuk menghindari situasi seperti ini, PDO menyediakan mekanisme khusus yang disebut prepared statements (kueri yang telah dipersiapkan). Kita akan membahasnya dalam pelajaran selanjutnya.
Sengaja lakukan SQL injection ke basis data Anda.