MySQLจะป้องกันการฉีด sql ได้อย่างไร? หลักการและการป้องกันการฉีด SQL
MySQL และการฉีด SQL
หากคุณนำข้อมูลที่ผู้ใช้ป้อนผ่านหน้าเว็บและแทรกลงใน aฐานข้อมูล MySQLแสดงว่าอาจมีปัญหาด้านความปลอดภัยของการฉีด SQL
บทนี้จะแนะนำวิธีการป้องกันการแทรก SQL และใช้สคริปต์เพื่อกรองอักขระที่แทรกใน SQL
การฉีด SQL ที่เรียกว่าเป็นการหลอกลวงเซิร์ฟเวอร์ให้รันคำสั่ง SQL ที่เป็นอันตรายโดยการแทรกคำสั่ง SQL ลงในเว็บฟอร์มเพื่อส่งหรือป้อนสตริงการสืบค้นของชื่อโดเมนหรือคำขอหน้า
เราไม่ควรเชื่อถืออินพุตของผู้ใช้ เราต้องถือว่าข้อมูลที่ป้อนของผู้ใช้ไม่ปลอดภัย และเราทุกคนจำเป็นต้องกรองข้อมูลอินพุตของผู้ใช้
ในตัวอย่างต่อไปนี้ ชื่อผู้ใช้ที่ป้อนต้องเป็นตัวอักษร ตัวเลข และขีดล่างผสมกัน และชื่อผู้ใช้ต้องมีความยาวระหว่าง 8 ถึง 20 อักขระ:
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) { $result = mysqli_query($conn, "SELECT * FROM users WHERE username=$matches[0]"); } else { echo "username 输入异常"; }
มาดูสถานการณ์ SQL ที่เกิดขึ้นเมื่อไม่มีการกรองอักขระพิเศษ:
// 设定$name 中插入了我们不需要的SQL语句 $name = "Qadir'; DELETE FROM users;"; mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
ในคำสั่งฉีดข้างต้น เราไม่ได้กรองตัวแปรของ $name คำสั่ง SQL ที่เราไม่ต้องการจะถูกแทรกลงใน $name ซึ่งจะลบข้อมูลทั้งหมดในตารางผู้ใช้
mysqli_query() ใน PHP ไม่ได้รับอนุญาตให้ดำเนินการคำสั่ง SQL หลายคำสั่ง แต่ SQLite และ PostgreSQL สามารถดำเนินการคำสั่ง SQL หลายคำสั่งพร้อมกันได้ ดังนั้นเราจึงต้องตรวจสอบข้อมูลของผู้ใช้เหล่านี้อย่างเคร่งครัด
เพื่อป้องกันการฉีด SQL เราต้องใส่ใจกับประเด็นต่อไปนี้:
- 1. อย่าเชื่อข้อมูลของผู้ใช้ตรวจสอบอินพุตของผู้ใช้ คุณสามารถใช้นิพจน์ทั่วไปหรือจำกัดความยาว แปลงเครื่องหมายอัญประกาศเดี่ยวและคู่ "-" เป็นต้น
- 2. ห้ามใช้ sql แอสเซมบลีไดนามิก คุณสามารถใช้ sql ที่มีพารามิเตอร์หรือใช้กระบวนงานที่เก็บไว้โดยตรงสำหรับการสืบค้นข้อมูลและการเข้าถึง
- 3. ห้ามใช้การเชื่อมต่อฐานข้อมูลที่มีสิทธิ์ของผู้ดูแลระบบ ใช้การเชื่อมต่อฐานข้อมูลแยกต่างหากโดยมีสิทธิ์จำกัดสำหรับแต่ละแอปพลิเคชัน
- 4. ห้ามจัดเก็บข้อมูลที่เป็นความลับโดยตรง เข้ารหัสหรือแฮชรหัสผ่านและข้อมูลที่ละเอียดอ่อน
- 5. ข้อมูลข้อยกเว้นของแอปพลิเคชันควรให้คำแนะนำน้อยที่สุดเท่าที่จะเป็นไปได้ และเป็นการดีที่สุดที่จะใช้ข้อมูลข้อผิดพลาดที่กำหนดเองเพื่อรวมข้อมูลข้อผิดพลาดดั้งเดิม
- 6. วิธีการตรวจหา sql injection โดยทั่วไปใช้ auxiliary软件หรือแพลตฟอร์มเว็บไซต์เพื่อตรวจจับ ซอฟต์แวร์โดยทั่วไปใช้เครื่องมือตรวจจับการฉีด sql jsky แพลตฟอร์มเว็บไซต์มีเครื่องมือตรวจจับแพลตฟอร์มความปลอดภัยเว็บไซต์ Yisi MDCSOFT SCAN และคณะการใช้ MDCSOFT-IPS สามารถป้องกันการฉีด SQL, การโจมตี XSS ฯลฯ ได้อย่างมีประสิทธิภาพ
ป้องกันการฉีด SQL
ในภาษาสคริปต์เช่น Perl และ PHP คุณสามารถหลีกเลี่ยงข้อมูลที่ผู้ใช้ป้อนเพื่อป้องกันการฉีด SQL
ส่วนขยาย MySQL สำหรับ PHP มีฟังก์ชัน mysqli_real_escape_string() เพื่อหลีกหนีอักขระพิเศษที่ป้อน
if (get_magic_quotes_gpc()) { $name = stripslashes($name); } $name = mysqli_real_escape_string($conn, $name); mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
ฉีดในคำชี้แจงสิทธิ์
เมื่อทำการสืบค้น หากผู้ใช้ป้อนค่าด้วย "_" และ "%" สิ่งนี้จะเกิดขึ้น: เดิมทีผู้ใช้ต้องการสืบค้น "abcd_" แต่ผลลัพธ์การสืบค้นประกอบด้วย "abcd_", "abcde" และ "abcdf " ฯลฯ ปัญหาเกิดขึ้นเมื่อผู้ใช้ต้องการสอบถาม "30%" (หมายเหตุ: สามสิบเปอร์เซ็นต์)
ในสคริปต์ PHP เราสามารถใช้ฟังก์ชัน addcslashes() เพื่อจัดการกับสถานการณ์ข้างต้น ดังในตัวอย่างต่อไปนี้:
$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_"); // $sub == \%something\_ mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
ฟังก์ชัน addcslashes() เพิ่มแบ็กสแลชก่อนอักขระที่ระบุ
รูปแบบไวยากรณ์:
addcslashes(string,characters)
参数 | ลักษณะ |
---|---|
เชือก | ที่จำเป็น.ระบุสตริงที่จะตรวจสอบ |
อักขระ | ไม่จำเป็น.ระบุอักขระหรือช่วงของอักขระที่ได้รับผลกระทบจาก addcslashes() |
หวัง Chen Weiliang บล็อก ( https://www.chenweiliang.com/ ) แชร์ " MySQL ป้องกันการฉีด sql ได้อย่างไร? หลักการและการป้องกันการฉีด sql" จะช่วยคุณได้
ยินดีต้อนรับสู่การแบ่งปันลิงค์ของบทความนี้:https://www.chenweiliang.com/cwl-500.html
ยินดีต้อนรับสู่ช่อง Telegram ของบล็อกของ Chen Weiliang เพื่อรับข่าวสารล่าสุด!
📚 คู่มือนี้มีคุณค่ามหาศาล 🌟 นี่เป็นโอกาสที่หายาก อย่าพลาด! ⏰⌛💨
แชร์และชอบถ้าคุณชอบ!
การแบ่งปันและไลค์ของคุณเป็นแรงจูงใจอย่างต่อเนื่องของเรา!