หยุด!
คุณกำลังทำผิดพลาดที่นี่ โอ้ไม่คุณเลือกฟังก์ชั่น PHP ที่เหมาะสมเพื่อทำให้ข้อมูลของคุณปลอดภัยยิ่งขึ้น ไม่เป็นไร. ความผิดพลาดของคุณอยู่ในลำดับของการดำเนินการและวิธีการใช้ฟังก์ชันเหล่านี้และที่ไหน
สิ่งสำคัญคือการเข้าใจถึงความแตกต่างระหว่างการฆ่าเชื้อและการตรวจสอบความถูกต้องของข้อมูลผู้ใช้การหลีกเลี่ยงข้อมูลสำหรับการจัดเก็บและการหลีกเลี่ยงข้อมูลเพื่อการนำเสนอ
ฆ่าเชื้อโรคและตรวจสอบข้อมูลผู้ใช้
เมื่อผู้ใช้ส่งข้อมูลคุณต้องแน่ใจว่าพวกเขาได้มอบสิ่งที่คุณคาดหวัง
การฆ่าเชื้อและการกรอง
ตัวอย่างเช่นถ้าคุณคาดหวังตัวเลข ให้แน่ใจว่าข้อมูลที่ส่งเป็นจำนวน นอกจากนี้คุณยังสามารถส่งข้อมูลผู้ใช้เป็นประเภทอื่นได้ ทุกอย่างที่ส่งจะได้รับการปฏิบัติเหมือนเป็นสตริงดังนั้นการบังคับให้ข้อมูลตัวเลขที่รู้จักกันเป็นจำนวนเต็มหรือลอยทำให้การฆ่าเชื้อนั้นรวดเร็วและไม่เจ็บปวด
แล้วเขตข้อมูลข้อความและ textareas แบบฟรีฟอร์มล่ะ คุณต้องตรวจสอบให้แน่ใจว่าไม่มีอะไรที่ไม่คาดคิดในฟิลด์เหล่านั้น ส่วนใหญ่คุณต้องตรวจสอบให้แน่ใจว่าฟิลด์ที่ไม่ควรมีเนื้อหา HTML ใด ๆ ไม่มี HTML จริงๆ มีสองวิธีที่คุณสามารถจัดการกับปัญหานี้ได้
ครั้งแรกที่คุณสามารถลองหลบหนีการป้อนข้อมูล HTML htmlspecialchars
ที่มี คุณไม่ควรใช้htmlentities
เพื่อทำให้เป็นกลาง HTML เนื่องจากจะทำการเข้ารหัสอักขระที่เน้นเสียงและอักขระอื่น ๆ ที่คิดว่าจำเป็นต้องเข้ารหัสเช่นกัน
ประการที่สองคุณสามารถลองลบ HTML ที่เป็นไปได้ strip_tags
รวดเร็วและง่าย แต่ก็เลอะเทอะ ตัวกรอง HTMLทำงานอย่างละเอียดมากขึ้นทั้งในการแยก HTML ทั้งหมดออกและยังอนุญาตรายการที่อนุญาตของแท็กและแอตทริบิวต์ผ่าน
PHP เวอร์ชันใหม่มาพร้อมกับส่วนขยายตัวกรองซึ่งเป็นวิธีที่ครอบคลุมในการฆ่าเชื้ออินพุตของผู้ใช้
การตรวจสอบ
ตรวจสอบให้แน่ใจว่าข้อมูลที่ส่งปราศจากเนื้อหาที่ไม่คาดคิดนั้นเป็นเพียงครึ่งหนึ่งของงาน คุณต้องลองและตรวจสอบให้แน่ใจว่าข้อมูลที่ส่งมีค่าที่คุณสามารถใช้งานได้จริง
หากคุณคาดหวังว่าจะมีตัวเลขระหว่าง 1 ถึง 10 คุณจะต้องตรวจสอบค่านั้น หากคุณกำลังใช้อินพุตตัวเลขยุค HTML5 แฟนซีใหม่ที่มีสปินเนอร์และขั้นตอนตรวจสอบให้แน่ใจว่าข้อมูลที่ส่งนั้นสอดคล้องกับขั้นตอน
หากข้อมูลนั้นมาจากสิ่งที่ควรเป็นเมนูแบบเลื่อนลงตรวจสอบให้แน่ใจว่าค่าที่ส่งเป็นข้อมูลที่ปรากฏในเมนู
สิ่งที่เกี่ยวกับการป้อนข้อความที่ตอบสนองความต้องการอื่น ๆ ยกตัวอย่างเช่นปัจจัยการผลิตวันที่ควรจะผ่านการตรวจสอบstrtotime
หรือระดับ DateTime วันที่ที่กำหนดควรอยู่ในช่วงที่คุณคาดหวัง แล้วที่อยู่อีเมลล่ะ ที่กล่าวถึงก่อนหน้านี้การขยายตัวกรองสามารถตรวจสอบว่ามีที่อยู่เป็นรูปแบบที่ดี แต่ฉันเป็นแฟนของห้องสมุด is_email
เช่นเดียวกับการควบคุมรูปแบบอื่นทั้งหมด มีปุ่มตัวเลือกหรือไม่ ตรวจสอบกับรายการ มีช่องทำเครื่องหมาย? ตรวจสอบกับรายการ มีไฟล์อัพโหลดไหม ตรวจสอบให้แน่ใจว่าไฟล์เป็นประเภทที่คาดหวังและจัดการกับชื่อไฟล์เช่นข้อมูลผู้ใช้ที่ไม่มีการกรอง
เบราว์เซอร์ที่ทันสมัยทุกอันมาพร้อมกับชุดเครื่องมือสำหรับนักพัฒนาที่สมบูรณ์ซึ่งถูกสร้างขึ้นมาเพื่อให้ทุกคนจัดการกับฟอร์มของคุณได้ง่าย รหัสของคุณควรถือว่าผู้ใช้ลบข้อ จำกัด ฝั่งไคลเอ็นต์ทั้งหมดในเนื้อหาของฟอร์มอย่างสมบูรณ์ !
การหนีข้อมูลสำหรับการจัดเก็บ
เมื่อคุณแน่ใจแล้วว่าข้อมูลของคุณอยู่ในรูปแบบที่คาดหวังและมีค่าที่คาดไว้เท่านั้นคุณต้องกังวลเกี่ยวกับการเก็บข้อมูลนั้นไว้ในที่จัดเก็บ
กลไกการจัดเก็บข้อมูลทุกตัวมีวิธีการเฉพาะเพื่อให้แน่ใจว่าข้อมูลได้รับการยกเว้นและเข้ารหัสอย่างเหมาะสม หากคุณกำลังสร้าง SQL แล้ววิธีที่ยอมรับเพื่อส่งผ่านข้อมูลในการสืบค้นผ่านงบเตรียมด้วยตัวยึด
หนึ่งในวิธีที่ดีกว่าที่จะทำงานร่วมกับฐานข้อมูล SQL ที่สุดใน PHP เป็นส่วนขยาย PDO มันเป็นไปตามรูปแบบที่พบบ่อยของการเตรียมความพร้อมคำสั่ง , ผูกพันตัวแปรคำสั่งแล้วส่งคำสั่งและตัวแปรไปยังเซิร์ฟเวอร์ หากคุณยังไม่ได้ทำงานด้วย PDO ก่อนที่นี่เป็นที่ดีงาม MySQL ที่มุ่งเน้นการกวดวิชา
บางฐานข้อมูล SQL มีนามสกุลพิเศษของพวกเขาเองใน PHP รวมทั้งSQL Server , PostgreSQLและSQLite 3 ส่วนขยายเหล่านั้นแต่ละรายการได้เตรียมการสนับสนุนคำสั่งที่ดำเนินการในรูปแบบเตรียมผูก - รันเดียวกับ PDO บางครั้งคุณอาจต้องใช้ส่วนขยายเหล่านี้แทน PDO เพื่อสนับสนุนคุณสมบัติหรือพฤติกรรมที่ไม่ได้มาตรฐาน
MySQL ยังมีส่วนขยาย PHP ของตัวเอง พวกเขาทั้งสองในความเป็นจริง. คุณเพียงต้องการที่เคยใช้หนึ่งเรียกว่าmysqli นามสกุล "mysql" เดิมเลิกใช้แล้วและไม่ปลอดภัยหรือมีเหตุผลที่จะใช้ในยุคปัจจุบัน
ฉันไม่ใช่แฟนของ mysqli วิธีที่จะทำการเชื่อมโยงตัวแปรในข้อความสั่งที่เตรียมไว้นั้นไม่ยืดหยุ่นและอาจทำให้เกิดความเจ็บปวดในการใช้งาน หากมีข้อสงสัยให้ใช้ PDO แทน
หากคุณไม่ได้ใช้ฐานข้อมูล SQL เพื่อจัดเก็บข้อมูลของคุณให้ตรวจสอบเอกสารประกอบสำหรับส่วนต่อประสานฐานข้อมูลที่คุณใช้เพื่อกำหนดวิธีการส่งผ่านข้อมูลอย่างปลอดภัย
เมื่อเป็นไปได้ตรวจสอบให้แน่ใจว่าฐานข้อมูลของคุณเก็บข้อมูลของคุณในรูปแบบที่เหมาะสม เก็บหมายเลขไว้ในช่องตัวเลข เก็บวันที่ในช่องวันที่ เก็บเงินไว้ในฟิลด์ทศนิยมไม่ใช่ฟิลด์ทศนิยม ตรวจสอบเอกสารที่จัดทำโดยฐานข้อมูลของคุณเกี่ยวกับวิธีการจัดเก็บข้อมูลประเภทต่าง ๆ อย่างถูกต้อง
หนีข้อมูลเพื่อการนำเสนอ
ทุกครั้งที่คุณแสดงข้อมูลต่อผู้ใช้คุณต้องตรวจสอบให้แน่ใจว่าข้อมูลได้รับการยกเว้นอย่างปลอดภัยเว้นแต่คุณจะรู้ว่าไม่ควรหลีกเลี่ยงข้อมูลนั้น
เมื่อเปล่ง HTML คุณควรส่งข้อมูลใด ๆ ที่ผู้ใช้จัดหาผ่านhtmlspecialchars
มา ในความเป็นจริงเพียงครั้งเดียวที่คุณไม่ควรทำเช่นนี้คือเมื่อคุณรู้ว่าผู้ใช้ให้ HTML และคุณรู้ว่ามันถูกทำให้สะอาดแล้วโดยใช้บัญชีขาว
บางครั้งคุณต้องสร้าง Javascript โดยใช้ PHP Javascript ไม่มีกฎการหลบหนีเช่นเดียวกับ HTML! วิธีที่ปลอดภัยเพื่อให้ค่าใช้จ่ายให้กับจาวาสคริปต์ผ่าน PHP json_encode
เป็นผ่าน
และอื่น ๆ
มีความแตกต่างในการตรวจสอบข้อมูลอีกมากมาย
ยกตัวอย่างเช่นการเข้ารหัสชุดอักขระอาจจะเป็นกับดักขนาดใหญ่ ใบสมัครของคุณควรปฏิบัติตามแนวทางปฏิบัติที่ระบุไว้ใน " UTF-8 ไปตลอดทาง " มีการโจมตีสมมุติฐานที่สามารถเกิดขึ้นได้เมื่อคุณปฏิบัติต่อข้อมูลสตริงเป็นชุดอักขระที่ไม่ถูกต้อง
ก่อนหน้านี้ฉันพูดถึงเครื่องมือดีบักของเบราว์เซอร์ เครื่องมือเหล่านี้สามารถใช้เพื่อจัดการข้อมูลคุกกี้ คุกกี้ควรจะถือว่าเป็นผู้ใช้ป้อนข้อมูลที่ไม่น่าเชื่อถือ
การตรวจสอบความถูกต้องของข้อมูลและการหลบหนีเป็นเพียงส่วนหนึ่งของความปลอดภัยของเว็บแอปพลิเคชัน คุณควรทำให้ตัวเองตระหนักถึงวิธีการโจมตีเว็บแอปพลิเคชันเพื่อให้คุณสามารถสร้างการป้องกันได้