Latest web development tutorials

ฉีด 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 ก็จะนำไปสู่ผลลัพธ์ที่แปลกเมื่อเรียกข้อมูล