ปัญหาของการ query ใน PDO ของ PHP

ดังที่คุณทราบดีแล้วว่า คำสั่ง SQL นั้นเสี่ยงต่อการถูกโจมตีด้วย SQL injection ส่วนขยาย PDO ถูกสร้างขึ้นมาเพื่อจัดการกับปัญหา injection เหล่านี้ แต่ โดยค่าเริ่มต้นแล้ว มันจะไม่ทำการป้องกันให้โดยอัตโนมัติ

เรามาดูปัญหาด้วยตัวอย่างกัน สมมติว่าเรามีคำสั่ง query ต่อไปนี้ ซึ่งมีการแทรกตัวแปรเข้าไป:

php<?php
  $sql = "SELECT * FROM users WHERE id=$id";
  $res = $pdo->query($sql);
?>

สมมติว่าตัวแปรของเรามาจากแหล่งข้อมูลภายนอก เช่น มาจากพารามิเตอร์ GET เพื่อให้ง่ายขึ้น เรามากำหนดค่า ของมันด้วยมือกัน เราคาดหวังว่าจะได้ค่า ตัวเลขบางค่า เช่น ค่านี้:

php<?php
  $id = 1;
?>

อย่างไรก็ตาม แฮกเกอร์เจ้าเล่ห์สามารถส่ง ค่าต่อไปนี้มาได้ (สมมติว่าเรามี ฟิลด์ role):

php<?php
  $id = '-1 OR role="admin"';
?>

ปรากฏว่า เราต้องการคำสั่ง query นี้:

php<?php
  $sql = "SELECT * FROM users WHERE id=1";
  $res = $pdo->query($sql);
?>

แต่กลับได้คำสั่ง query ต่อไปนี้ ซึ่งดึงข้อมูล ผู้ดูแลระบบของเว็บไซต์ออกมา:

php<?php
  $sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
  $res = $pdo->query($sql);
?>

เพื่อหลีกเลี่ยงสถานการณ์เช่นนี้ ใน PDO จึงมีกลไกพิเศษเตรียมไว้ ซึ่งเรียกว่า prepared statements ซึ่งเราจะมาศึกษาในบทเรียนถัดไป

Задание 1

ให้ลองทำ SQL injection ไปยังฐานข้อมูลของคุณอย่างตั้งใจ