Masalah Pertanyaan dalam PDO di PHP
Seperti yang anda patut sudah tahu, pertanyaan SQL terdedah kepada suntikan SQL. Sambungan PDO dicipta untuk melawan suntikan, tetapi secara default, ia tidak melakukannya secara automatik.
Mari kita lihat masalah ini dengan contoh. Katakan kita mempunyai pertanyaan berikut, di mana pembolehubah dimasukkan:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
Katakan pembolehubah kita datang dari sumber luaran, contohnya, dari parameter GET. Untuk kesederhanaan, bagaimanapun, mari kita tetapkan nilainya secara manual. Kami menjangkakan beberapa nilai nombor, contohnya, seperti ini:
<?php
$id = 1;
?>
Walau bagaimanapun, penggodam jahat boleh menghantar
nilai berikut (anggap kita mempunyai
medan role):
<?php
$id = '-1 OR role="admin"';
?>
Jadi, kami mahukan pertanyaan berikut:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
Tetapi kami mendapat yang berikut, yang menarik pentadbir laman web:
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
Untuk mengelakkan situasi sedemikian, PDO mempunyai mekanisme khas, yang dipanggil prepared statements. Kami akan membincangkannya dalam pelajaran seterusnya.
Sengaja laksanakan suntikan SQL pada pangkalan data anda.