วิธีป้องกันการฉีด SQL ใน PHP (พร้อมรูปภาพ)

สารบัญ:

วิธีป้องกันการฉีด SQL ใน PHP (พร้อมรูปภาพ)
วิธีป้องกันการฉีด SQL ใน PHP (พร้อมรูปภาพ)

วีดีโอ: วิธีป้องกันการฉีด SQL ใน PHP (พร้อมรูปภาพ)

วีดีโอ: วิธีป้องกันการฉีด SQL ใน PHP (พร้อมรูปภาพ)
วีดีโอ: ขั้นตอนการตรวจซ่อมภาคจ่ายไฟทีวี Ep.3 2024, เมษายน
Anonim

บทความวิกิฮาวนี้จะแนะนำวิธีการป้องกันการฉีด SQL โดยใช้ข้อความที่เตรียมไว้ใน PHP การฉีด SQL เป็นหนึ่งในช่องโหว่ที่พบบ่อยที่สุดในเว็บแอปพลิเคชันในปัจจุบัน คำสั่งที่เตรียมไว้ใช้พารามิเตอร์ที่ถูกผูกไว้และไม่รวมตัวแปรกับสตริง SQL ทำให้ผู้โจมตีไม่สามารถแก้ไขคำสั่ง SQL ได้

คำสั่งที่เตรียมไว้จะรวมตัวแปรเข้ากับคำสั่ง SQL ที่คอมไพล์แล้ว เพื่อให้ SQL และตัวแปรถูกส่งแยกกัน ตัวแปรจะถูกตีความว่าเป็นสตริงเท่านั้นและไม่ได้เป็นส่วนหนึ่งของคำสั่ง SQL เมื่อใช้เมธอดในขั้นตอนด้านล่าง คุณจะไม่จำเป็นต้องใช้เทคนิคการกรอง SQL injection อื่น ๆ เช่น mysql_real_escape_string()

ขั้นตอน

ส่วนที่ 1 จาก 2: ทำความเข้าใจเกี่ยวกับการฉีด SQL

ขั้นตอนที่ 1 SQL Injection เป็นช่องโหว่ประเภทหนึ่งในแอปพลิเคชันที่ใช้ฐานข้อมูล SQL

ช่องโหว่เกิดขึ้นเมื่อผู้ใช้ป้อนข้อมูลในคำสั่ง SQL:

$name = $_GET['ชื่อผู้ใช้']; $query = "เลือกรหัสผ่านจาก tbl_user โดยที่ name = '$name' ";

ขั้นตอนที่ 2 ค่าที่ผู้ใช้ป้อนในชื่อผู้ใช้ตัวแปร URL จะถูกกำหนดให้กับตัวแปร $name

จากนั้นจะใส่ลงในคำสั่ง SQL โดยตรง ทำให้ผู้ใช้สามารถแก้ไขคำสั่ง SQL ได้

$name = "ผู้ดูแลระบบ" หรือ 1=1 -- "; $query = "เลือกรหัสผ่านจาก tbl_user โดยที่ name = '$name' ";

ขั้นตอนที่ 3 ฐานข้อมูล SQL จะได้รับคำสั่ง SQL ดังต่อไปนี้:

เลือกรหัสผ่านจาก tbl_users WHERE name = 'admin' OR 1=1 -- '

  • นี่เป็น SQL ที่ถูกต้อง แต่แทนที่จะส่งคืนรหัสผ่านเดียวสำหรับผู้ใช้ คำสั่งจะส่งคืนรหัสผ่านทั้งหมดในตาราง tbl_user นี่ไม่ใช่สิ่งที่คุณต้องการในเว็บแอปพลิเคชันของคุณ

ส่วนที่ 2 จาก 2: การใช้ mySQLi เพื่อสร้างคำสั่งที่เตรียมไว้

2542820 1
2542820 1

ขั้นตอนที่ 1 สร้าง mySQLi SELECT Query

ใช้รหัสด้านล่างเพื่อเลือกข้อมูลจากตารางโดยใช้คำสั่ง mySQLi ที่เตรียมไว้

$name = $_GET['ชื่อผู้ใช้']; if ($stmt = $mysqli->prepare("SELECT password FROM tbl_users WHERE name=?")) { // ผูกตัวแปรกับพารามิเตอร์เป็นสตริง $stmt->bind_param("s", $name); // ดำเนินการคำสั่ง $stmt->execute(); // รับตัวแปรจากแบบสอบถาม $stmt->bind_result($ผ่าน); //ดึงข้อมูล $stmt->ดึงข้อมูล(); // แสดงข้อมูล printf("รหัสผ่านสำหรับผู้ใช้ %s คือ %s\n", $name, $pass); // ปิดคำสั่งที่เตรียมไว้ $stmt->ปิด(); }

หมายเหตุ: ตัวแปร $mysqli คือ mySQLi Connection Object

2542820 2
2542820 2

ขั้นตอนที่ 2 สร้าง mySQLi INSERT Query

ใช้รหัสด้านล่างเพื่อ INSERT ข้อมูลลงในตารางโดยใช้คำสั่ง mySQLi ที่เตรียมไว้

$name = $_GET['ชื่อผู้ใช้']; $password = $_GET['รหัสผ่าน']; if ($stmt = $mysqli->prepare("INSERT INTO tbl_users (name, password) VALUES (?, ?)")) { // ผูกตัวแปรกับพารามิเตอร์เป็นสตริง $stmt->bind_param("ss", $name, $password); // ดำเนินการคำสั่ง $stmt->execute(); // ปิดคำสั่งที่เตรียมไว้ $stmt->ปิด(); }

หมายเหตุ: ตัวแปร $mysqli คือ mySQLi Connection Object

2542820 3
2542820 3

ขั้นตอนที่ 3 สร้างแบบสอบถาม mySQLi UPDATE

ใช้รหัสด้านล่างเพื่ออัปเดตข้อมูลในตารางโดยใช้คำสั่ง mySQLi ที่เตรียมไว้

$name = $_GET['ชื่อผู้ใช้']; $password = $_GET['รหัสผ่าน']; if ($stmt = $mysqli->prepare("UPDATE tbl_users SET password = ? WHERE name = ?")) { // ผูกตัวแปรกับพารามิเตอร์เป็นสตริง $stmt->bind_param("ss", $รหัสผ่าน, $name); // ดำเนินการคำสั่ง $stmt->execute(); // ปิดคำสั่งที่เตรียมไว้ $stmt->ปิด(); }

หมายเหตุ: ตัวแปร $mysqli คือ mySQLi Connection Object

2542820 4
2542820 4

ขั้นตอนที่ 4 สร้าง mySQLi DELETE Query

สคริปต์ด้านล่างเป็นวิธีการลบข้อมูลออกจากตารางโดยใช้คำสั่ง mySQLi ที่เตรียมไว้

$name = $_GET['ชื่อผู้ใช้']; $password = $_GET['รหัสผ่าน']; if ($stmt = $mysqli->prepare("DELETE FROM tbl_users WHERE name = ?")) {// ผูกตัวแปรกับพารามิเตอร์เป็นสตริง $stmt->bind_param("s", $name); // ดำเนินการคำสั่ง $stmt->execute(); // ปิดคำสั่งที่เตรียมไว้ $stmt->ปิด(); }

แนะนำ: