คุณควร จำกัด การเข้าถึงไฟล์ธีมโดยตรงหรือไม่


31

ฉันพบตัวอย่างต่อไปนี้ในธีมเป็นครั้งคราว:

if ( ! defined('ABSPATH')) exit('restricted access');

มันเป็นจุดเริ่มต้นของไฟล์ PHP (ทั้งหมดหรือไม่) ในรูปแบบและควรป้องกันการเข้าถึงไฟล์โดยตรงจากแหล่งที่เลวร้าย

ฉันเห็นว่านี่ไม่รวมอยู่ในยี่สิบหรือสิบเอ็ดและฉันไม่เคยเห็นมันแนะนำในเอกสาร WordPress อย่างเป็นทางการ ดูเหมือนจะเป็นความคิดที่ดีสำหรับฉัน แต่ฉันก็ไม่รู้เกี่ยวกับความปลอดภัยพอที่จะตัดสินและไม่สามารถหาได้มากนักจาก Google

นี่คือสิ่งที่ฉันควรมีในธีมที่กำหนดเองของฉันหรือไม่ ถ้าเป็นเช่นนั้นควรเป็นไฟล์ PHP ทั้งหมดหรือบางไฟล์?


7
เพียงเพื่อผู้อ่านในภายหลังนี้สามารถเขียนได้สั้นลงและดีขึ้น:defined('ABSPATH') OR exit;
ไกเซอร์

หรือสั้นกว่า:: defined('WPINC') ? : die();P
Tim Elsass

ฉันยังสงสัยว่ามันคุ้มค่าในการใส่รหัสบางอย่างเช่นนี้เพียงเพื่อหลีกเลี่ยงการเห็นข้อผิดพลาด PHP เกี่ยวกับฟังก์ชั่นที่ไม่ได้กำหนดในบันทึกข้อผิดพลาดของฉัน ดูเหมือนว่าบอตต้องการกดไฟล์เหล่านี้โดยตรงและบางครั้งฉันได้รับข้อผิดพลาดเช่น 'Call to undefined function query_posts ()' เพราะ bootstrap WP ไม่ได้ถูกโหลด
Matt Keys

คำตอบ:


26

โดยปกติแล้วคุณไม่ต้องการมัน แต่…มีกรณีขอบอย่างน้อยหนึ่งกรณี:

  • หากไฟล์ธีมเป็นส่วนเทมเพลต ,
  • และมันกำลังใช้ตัวแปรโกลบอลจากบริบทการโทร (ไฟล์พาเรนต์)
  • และ register_globalsคือon ,
  • และมันก็แค่ใช้ตัวแปรเหล่านี้โดยไม่มีการตรวจสอบความปลอดภัย ...

... ผู้โจมตีสามารถเรียกไฟล์นี้ตั้งค่าตัวแปรที่ขาดหายไปด้วยGETหรือPOSTทำให้ไฟล์ธีมพิมพ์ออกมา และแล้วเราก็คือปัญหาด้านความปลอดภัย

ดังนั้น…ตัวเลือกที่ดีที่สุดไม่ใช่การตรวจสอบบริบทเหมือนกับตัวอย่างจากคุณ แต่เป็นรหัสที่ดี: หลีกเลี่ยงตัวแปรทั่วโลกตรวจสอบเนื้อหาก่อนที่จะพิมพ์ออกมา

ในบางกรณีฉันเพิ่มการตรวจสอบบริบทเมื่อฉันคิดว่าคนอื่นจะใช้รหัสของฉันและเปลี่ยนแปลงโดยไม่คำนึงถึงความปลอดภัย มันไม่เจ็บ


หากส่วนเทมเพลตยังคงมีการเรียกฟังก์ชันอย่างน้อยหนึ่งครั้งที่จะทำให้เกิดข้อผิดพลาดร้ายแรงใน PHP สถานการณ์นี้จะเป็นไปได้ไหม
Chris_O

@Chris_O ขึ้นอยู่กับลำดับของการปรากฏ
fuxia

เหมาะสมและเห็นด้วยอย่างยิ่งกับเหตุผลอื่นที่ไม่ใช้ตัวแปรโกลบอลระหว่างการโทรไฟล์
Chris_O

1
เป็นการดีที่สุดเสมอที่จะปลอดภัยกว่าขออภัย ความปลอดภัยมากเกินไปไม่สามารถทำร้ายได้หรือไม่
Sean Berg

2
หากคุณทำทุกอย่างถูกต้องคุณไม่ควรใช้รหัสที่ไม่จำเป็น คำถามนี้เป็นข้อพิสูจน์ว่ามันยากที่จะทำตามรหัส
fuxia
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.