ฉีด SQLite
ถ้าเว็บไซต์ของคุณช่วยให้ผู้ใช้ป้อนข้อมูลและการป้อนข้อมูลลงในฐานข้อมูล SQLite เวลานี้คุณจะต้องเผชิญกับปัญหาด้านความปลอดภัยเป็นที่รู้จักกันฉีด SQL บทนี้จะแสดงวิธีการเพื่อป้องกันไม่ให้เกิดขึ้นและเพื่อให้แน่ใจว่างบ SQLite สคริปต์การรักษาความปลอดภัย
ฉีดมักจะเกิดขึ้นเมื่อมีการร้องขอการป้อนข้อมูลของผู้ใช้เช่นผู้ใช้ต้องใส่ชื่อ แต่ผู้ใช้ป้อนคำสั่ง SQLite และคำสั่งนี้จะทำงานบนฐานข้อมูลโดยไม่รู้ตัว
ผู้ใช้จัดข้อมูลที่ไม่เคยไว้วางใจเพื่อให้การตรวจสอบเพียงการประมวลผลข้อมูลกฎจะกระทำโดยการจับคู่รูปแบบ ในตัวอย่างต่อไปนี้ชื่อผู้ใช้ชื่อผู้ใช้จะถูก จำกัด ตัวอักษรและตัวเลขหรือขีดความยาวต้องอยู่ระหว่าง 8-20 ตัวอักษร - ตามที่จำเป็นต้องปรับเปลี่ยนกฎเหล่านี้
ถ้า (preg_match ( "/ ^ \ W {} $ 8,20 /", $ _GET [ 'ชื่อผู้ใช้'], $ ตรงกัน)) { $ Db = SQLiteDatabase ใหม่ ( 'ชื่อไฟล์'); ผล $ = @ $ db-> แบบสอบถาม ( "SELECT * จากผู้ใช้ชื่อผู้ใช้ WHERE = $ ไม้ขีดไฟ [0]"); } else { echo "ชื่อผู้ใช้ไม่ได้รับการยอมรับ"; }
แสดงให้เห็นถึงปัญหานี้พิจารณาตัดตอนสมมติฐานนี้แสดงให้เห็นถึงปัญหาที่เกิดขึ้นพิจารณาตัดตอนนี้:
$ name = "กอดีร์ '; ลบจากผู้ใช้;"; @ $ db-> แบบสอบถาม ( "SELECT * จากผู้ใช้ชื่อผู้ใช้ WHERE = '{$ name}'");
เรียกใช้ฟังก์ชันเพื่อดึงชื่อคอลัมน์ที่ระบุโดยชื่อผู้ใช้ตรงกับบันทึกจากตารางผู้ใช้ภายใต้สถานการณ์ปกติ $ ชื่อประกอบด้วยตัวอักษรและตัวเลขเท่านั้นและช่องว่างเช่น Ilia สตริงแต่ที่นี่เพื่อชื่อ $ เพิ่มแบบสอบถามใหม่โทรไปยังฐานข้อมูลจะทำให้เกิดปัญหาภัยพิบัติ: ฉีดแบบสอบถามลบเพื่อลบระเบียนทั้งหมดของผู้ใช้
แม้ว่าจะมีไม่ได้รับอนุญาตให้ดำเนินการค้นหาหรือฐานข้อมูลอินเตอร์เฟซที่ซ้อนคำสั่งต่างๆในการเรียกใช้ฟังก์ชันเดียวหากคุณพยายามที่จะสแต็คแบบสอบถามแล้วเรียกล้มเหลว แต่ SQLite และ PostgreSQL ยังคงซ้อนกันในแบบสอบถามซึ่งมีการดำเนินการในสตริง แบบสอบถามทั้งหมดซึ่งอาจทำให้เกิดปัญหาด้านความปลอดภัยร้ายแรง
การป้องกัน SQL injection
ในภาษาสคริปต์เช่น Perl และ PHP, คุณชำนาญสามารถจัดการทั้งหมดของตัวหนี PHP ให้การเขียนโปรแกรมภาษาฟังก์ชันสตริงsqlite_escape_string () เพื่อ SQLite จะใช้ในการหลบหนีการป้อนตัวอักษรพิเศษ
ถ้า (get_magic_quotes_gpc ()) { $ name = sqlite_escape_string ($ ชื่อ); } ผล $ = @ $ db-> แบบสอบถาม ( "SELECT * จากผู้ใช้ชื่อผู้ใช้ WHERE = '{$ name}'");
แม้ว่าข้อมูลจะถูกเข้ารหัสเพื่อให้แทรกทำให้ปลอดภัยแต่มันจะทำให้การเปรียบเทียบข้อความที่เรียบง่ายในการค้นหาคอลัมน์มีข้อมูลไบนารีเช่นประโยคไม่สามารถใช้ได้
โปรดทราบ addslashes () ไม่ควรอ้างถึงในสตริงการสืบค้นข้อมูล SQLite ก็จะนำไปสู่ผลลัพธ์ที่แปลกเมื่อเรียกข้อมูล