ความแตกต่างระหว่าง esc_html, esc_attr, esc_html_e และอื่น ๆ คืออะไร?


13

ฉันได้รับคำติชมจากคนที่รักษาความปลอดภัยและเขาชี้ให้เห็นว่าฉันควรใช้การหลีกเลี่ยงการป้อนข้อมูลผู้ใช้ที่เหมาะสมในรหัสของฉัน ดังนั้นฉันทำวิจัยและพบฟังก์ชั่นการหลบหนี

ความแตกต่างระหว่างพวกเขาคืออะไร ฉันควรใช้esc_html()เมื่อใดและเมื่อesc_attr()ใด และเมื่อใดฉันจึงควรใช้ฟังก์ชั่นเหล่านี้ด้วย_e()ในตอนท้าย


1
คุณอ่านเอกสารหรือยัง?
Jacob Peattie

2
ใช่และนั่นทำให้ฉันสับสนมากยิ่งขึ้น :(
baldrick

คำตอบ:


21

esc_html()หนีออกมาจากสตริงเพื่อที่จะไม่แยกเป็น HTML ยกตัวอย่างเช่นตัวละครที่<ถูกแปลงเป็น &lt;สิ่งนี้จะมีลักษณะเหมือนกับเครื่องอ่าน แต่ก็หมายความว่าหากค่าที่ส่งออกเป็นค่า<script>นั้นเบราว์เซอร์จะไม่ถูกตีความว่าเป็นแท็กสคริปต์จริง

ใช้ฟังก์ชั่นนี้เมื่อใดก็ตามที่ค่าที่ส่งออกไม่ควรมี HTML

esc_attr()หนีจากสตริงเพื่อให้มีความปลอดภัยที่จะใช้ในแอตทริบิวต์ HTML เช่นclass=""เช่น การทำเช่นนี้จะป้องกันไม่ให้ค่าแตกออกจากแอตทริบิวต์ HTML ตัวอย่างเช่นหากค่าคือ"><script>alert();</script>และคุณพยายามที่จะส่งออกในแอตทริบิวต์ HTML ก็จะปิดแท็ก HTML ปัจจุบันและเปิดแท็กสคริปต์ สิ่งนี้ไม่ปลอดภัย การหลีกเลี่ยงค่านี้จะไม่สามารถปิดแอตทริบิวต์ HTML และแท็กและส่งออก HTML ที่ไม่ปลอดภัย

ใช้ฟังก์ชั่นนี้เมื่อแสดงผลค่าภายในแอตทริบิวต์ HTML

esc_url() หนีจากสตริงเพื่อให้แน่ใจว่าเป็น URL ที่ถูกต้อง

ใช้ฟังก์ชั่นนี้เมื่อส่งออกค่าภายในhref=""หรือsrc=""แอตทริบิวต์

esc_textarea()หนีค่าเพื่อให้มันปลอดภัยที่จะใช้ใน<textarea>องค์ประกอบ โดยการหลีกเลี่ยงค่าด้วยฟังก์ชั่นนี้จะป้องกันไม่ให้ค่าที่ส่งออกภายใน<textarea<จากการปิด<textarea>องค์ประกอบและการส่งออก HTML ของตัวเอง

ใช้ฟังก์ชั่นนี้เมื่อส่งออกค่าภายใน<textarea>องค์ประกอบ

esc_html()และesc_attr()นอกจากนี้ยังมีรุ่นที่ลงท้ายด้วย__(), และ_e() _x()สิ่งเหล่านี้ใช้สำหรับการส่งออกสตริงที่แปลได้

WordPress มีฟังก์ชั่น__(), _e()และ_x()สำหรับข้อความ outputting ที่สามารถได้รับการแปล __() ส่งกลับสตริงที่แปลได้_e() สะท้อนสตริงที่แปลได้และ_x()ส่งกลับสตริงที่แปลได้ด้วยบริบทที่กำหนด คุณอาจเคยเห็นพวกเขามาก่อน

เนื่องจากคุณไม่สามารถเชื่อถือไฟล์แปลได้เพื่อให้มีค่าที่ปลอดภัยการใช้ฟังก์ชั่นเหล่านี้เมื่อส่งออกสตริงที่แปลได้ทำให้แน่ใจได้ว่าสตริงที่ส่งออกไม่สามารถทำให้เกิดปัญหาเดียวกันที่อธิบายไว้ข้างต้น

ใช้ฟังก์ชันเหล่านี้เมื่อแสดงผลสตริงที่แปลได้


2
โปรดทราบว่าโดยค่าเริ่มต้นไม่มีความแตกต่างระหว่างesc_htmlและesc_attrใช้รหัสเดียวกัน (มีเพียงตัวกรองที่ไม่ได้ใช้งานที่แตกต่างกัน): wordpress.stackexchange.com/questions/264698/…
baptx

4

esc_htmlจะใช้ภายในของ html ตัวอย่างเช่นระหว่าง<p>แท็ก

<p><?php echo esc_html( $some_variable ); ?></p>

esc_attr จะถูกใช้เพื่อหลบหนีค่าแอตทริบิวต์ในแท็ก html ดังนี้:

<p my-attribute="<?php echo esc_attr( $some_variable ); ?>"></p>

การนำ_eไปใช้ที่ส่วนท้ายมีไว้สำหรับใช้กับโดเมนข้อความและจะสะท้อนให้คุณโดยอัตโนมัติเช่น:

<p><?php esc_html_e( 'some-text', 'text-domain' ); ?></p>

<p my-attribute="<?php esc_attr_e( 'some-text', 'text-domain' ); ?>"></p>

นอกจากนี้ยัง_eมี__ซึ่งจะเหมือนกัน_eแต่ไม่ได้สะท้อนมันเพื่อให้คุณสามารถเก็บไว้ในตัวแปร


2
_eไม่ได้มีไว้สำหรับการสะท้อนเท่านั้นมันมีไว้สำหรับการแปลภาษาท้องถิ่น ดังนั้นจึงควรใช้เมื่อสตริงถูกส่งผ่านไปยังฟังก์ชันและควรมีโดเมนข้อความ ตัวอย่างสุดท้ายของคุณคือการใช้ในทางที่ผิด
Jacob Peattie

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