เหตุใดฉันจึงควรใช้ esc_url


12

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

ตัวอย่างเช่นประโยชน์ด้านความปลอดภัยที่สำคัญและเป็นประโยชน์ในเชิงปฏิบัติโดยใช้คืออะไร

<?php echo esc_url( home_url( '/' ) ); ?>

แทน

<?php echo home_url() ?>

PS: ฉันไม่ได้พูดเกี่ยวกับการพัฒนาชุดรูปแบบ แต่เกี่ยวกับเว็บไซต์เฉพาะ

คำตอบ:


12

หากคุณตรวจสอบเอกสารเกี่ยวกับการตรวจสอบความถูกต้องของข้อมูลมันมีดังต่อไปนี้ที่จะพูดเกี่ยวกับฟังก์ชั่น:

ใช้ esc_url ทุกครั้งเมื่อฆ่าเชื้อ URL (ในโหนดข้อความ, โหนดแอตทริบิวต์หรือที่อื่น ๆ ) ปฏิเสธ URL ที่ไม่มีหนึ่งในโปรโตคอลที่อนุญาตพิเศษ [... ], กำจัดอักขระที่ไม่ถูกต้องและลบอักขระอันตราย

คุณมีมัน - ประโยชน์ด้านความปลอดภัยในทางปฏิบัติ โปรโตคอลที่ถูกต้องไม่มีตัวละครมืด

คำตอบเกี่ยวกับความจำเป็นคือใช่แน่นอน การหลีกเลี่ยงเอาต์พุตเป็นหลักปฏิบัติด้านความปลอดภัยขั้นพื้นฐานที่สุด


2
ด้วยความเคารพจากทั้งหมดฉันไม่สามารถดูว่าการเชื่อมโยงบ้านตัวอย่างสามารถมีความเสี่ยงด้านความปลอดภัย อาจเป็นแนวทางเหล่านี้สำหรับการสร้างชุดรูปแบบและไม่ได้ใช้สำหรับรหัส "ส่วนตัว"? ท้ายที่สุดมันอาจเป็นการดีที่สุดที่จะ hardcode ที่อยู่บ้านและลิงค์อื่น ๆ ใน html และไม่ใช้ php เลยถ้ามีความเสี่ยงด้านความปลอดภัย?
IXN

9
มันมีประสิทธิผลมากกว่าที่จะใช้วิธีปฏิบัติด้านความปลอดภัยอย่างต่อเนื่องและเป็นสากลมากกว่าการถกเถียงกันว่าแต่ละคดีมีความคุ้มค่าหรือไม่ :)
Rarst

7
บนมืออื่น ๆทรัพยากรแนะนำโดยCodexกำหนดกฎข้อที่ 3: ความน่าเชื่อถือ WordPress ดูเหมือนว่าสิ่งนี้จะแนะนำให้เทียบกับฟังก์ชั่นการทำงานหลักของ wp เช่นhome_url()ถ้าใช้ในบริบทที่เหมาะสม ตามคำแนะนำนี้ฉันคาดว่าhome_urlจะได้รับการฆ่าเชื้อด้วยตนเอง
Franco

3

ดีอินพุตของผู้ใช้ทั้งหมดควรได้รับการฆ่าเชื้อ ... หาก URL ที่คุณใส่ไม่ใช่การป้อนข้อมูลของผู้ใช้ (เช่นการตั้งค่าไซต์โดยคนที่คุณไว้วางใจอย่างเต็มที่ค่าฮาร์ดโค้ด) จากนั้นคุณอาจปลดเปลื้องตัวเองจาก esc-url

แต่ถ้าฉันสามารถฉีด URL นั้นไปยังเว็บไซต์ของคุณฉันสามารถฉีดรหัส js หรือรหัสการเปลี่ยนเส้นทางได้อย่างง่ายดาย ... หรือแม้แต่รหัสฝั่งเซิร์ฟเวอร์ในบางสถานการณ์

สิ่งนี้อาจนำไปสู่การไฮแจ็กเซสชันและบัญชีผู้ใช้ของคุณถูกขโมยและตัวเลือกที่ไม่ดีอื่น ๆ

แก้ไข:

ในตัวอย่างของคุณesc_url( home_url( '/' ) );
มันทำงานด้วยค่ากึ่งฮาร์ดโค้ด! ดังนั้นesc_urlสามารถถูกกำจัดได้
ที่กล่าวว่าฉันยังไม่เห็นว่าทำไมความแตกต่างรบกวนระหว่างเมื่อมีภัยคุกคามและเมื่อไม่มีและโดยทั่วไปจะแนะนำให้เก็บ esc_url () สำหรับทุกค่า


3
"การตั้งค่าไซต์โดยคนที่คุณเชื่อถือ" ยังคงเป็นผู้ใช้ที่แท้จริง :)
Rarst

@Rarst ใช่ฉันอยู่กับคุณ แต่เขาก็เป็น "เบื่อหน่าย" โดยใช้ esc_url ฉันได้รับการอภัยมากขึ้นเล็กน้อย
Tomer W

2

สิ่งที่อีกคนหนึ่งจะต้องเก็บไว้ในหัวของคุณเกี่ยวกับการ esc_url()เป็นบางอย่างเช่น<a href="SANITIZE_THIS_URL">your_text</a>ถ้าคุณกำลังจะใช้ URL ในการแสดงผล HTML ของคุณเช่นแอตทริบิวต์ href สำหรับการเชื่อมโยงหรือคุณลักษณะ src esc_url()สำหรับองค์ประกอบภาพที่คุณควรใช้

esc_url_raw()สำหรับกรณีอื่น ๆ ที่คุณต้องการ URL ที่สะอาด แต่คุณไม่ต้องการเข้ารหัสเอนทิตี HTML ดังนั้นการใช้ที่ไม่ใช่ HTML (DB, redirect) จะใช้สิ่งนี้

esc_url_raw()ฟังก์ชั่นจะทำสวยมากเช่นเดียวesc_url()แต่มันจะไม่ได้หน่วยงานถอดรหัสความหมายมันจะไม่แทนที่และกับ & # 038 และอื่น ๆ ตามที่ระบุไว้ Mark it มีความปลอดภัยที่จะใช้esc_url_raw()ในการสืบค้นฐานข้อมูลการเปลี่ยนเส้นทางและฟังก์ชั่น HTTP เช่น `wp_remote_get () 'สำหรับข้อมูลเพิ่มเติมเกี่ยวกับesc_url_raw ()


1

esc_urlใช้ในการสร้าง HTML ที่ถูกต้อง (เพื่อไม่ให้ฆ่าเชื้ออินพุต) คุณควรใช้สิ่งนี้ทุกครั้งที่คุณไม่แน่ใจ 100% ว่าสิ่งที่คุณต้องการส่งออกเป็น HTML ที่ถูกต้องสำหรับบริบทนั้น


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