Magento 2: การรักษาความปลอดภัยแม่แบบ: วิธีไหนที่จะใช้?


29

ฉันทราบว่าวีโอไอพี 2 มีหลายวิธีที่จะรักษาความปลอดภัยของเทมเพลต:

  • $block->escapeHtml()
  • $block->escapeQuote()
  • $block->escapeUrl()
  • $block->escapeXssInUrl()

แต่ฉันสงสัยว่าจะใช้วิธีเหล่านี้เมื่อใด

คำตอบ:


35

วิธีการหลบหนีในการAbstractBlockโทรแบบมอบหมายทั้งหมดMagento\Framework\Escaperดังนั้นคุณจะพบภาพรวมที่นั่น

ลองดูวิธีการสาธารณะและเอกสารประกอบ:

escapeHtml ()

/**
 * Escape string for HTML context. allowedTags will not be escaped, except the following: script, img, embed,
 * iframe, video, source, object, audio
 *
 * @param string|array $data
 * @param array|null $allowedTags
 * @return string|array
 */
public function escapeHtml($data, $allowedTags = null)

นี่ควรเป็นวิธีการยกเว้นค่าเริ่มต้นของคุณสำหรับเอาต์พุตใด ๆ อนุสัญญาก็คือผลลัพธ์ของวิธีการทั้งหมดที่ไม่มี "Html" จะต้องได้รับการยกเว้น

escapeHtmlAttr ()

( ตั้งแต่ Magento 2.2 )

/**
 * Escape a string for the HTML attribute context
 *
 * @param string $string
 * @param boolean $escapeSingleQuote
 * @return string
 */
public function escapeHtmlAttr($string, $escapeSingleQuote = true)

ใช้สิ่งนี้เพื่อหลีกเลี่ยงเอาต์พุตภายในแอตทริบิวต์ HTML ตัวอย่างเช่น

title="<?php echo $block->escapeHtmlAttr($title) ?>"

มันจะหลบหนี HTML แต่ยังคำพูด ( ")

โดยค่าเริ่มต้นมันจะหนีจากคำพูดเดียวดังนั้นมันก็ใช้ได้เช่นกัน:

onclick="alert('<?php echo $block->escapeHtmlAttr($message) ?>')"

ตั้งค่าพารามิเตอร์ที่สองเป็นเท็จหากไม่ต้องการ

escapeUrl ()

/**
 * Escape URL
 *
 * @param string $string
 * @return string
 */
public function escapeUrl($string)

สิ่งนี้สามารถใช้ในการส่งออก URL มันจะนำไปใช้เป็นค่าเริ่มต้น HTML หนีและยังเอาออกjavascript:, และvbscript: data:หากคุณต้องการป้องกัน URL เช่นนี้ในลิงก์ที่ผู้ใช้ระบุคุณสามารถใช้วิธีนี้ได้

คุณลักษณะนี้ไม่รวมอยู่ใน Magento 2.1 และคุณจำเป็นต้องใช้escapeXssInUrl()แทน ไม่มีเหตุผลที่จะใช้escapeUrl()เลย

มิฉะนั้นเพียงใช้$block->escapeHtmlAttr()สำหรับ URL

encodeUrlParam ()

( ตั้งแต่ Magento 2.2 )

/**
 * Encode URL
 *
 * @param string $string
 * @return string
 */
public function encodeUrlParam($string)

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

escapeJs ()

( ตั้งแต่ Magento 2.2 )

/**
 * Escape string for the JavaScript context
 *
 * @param string $string
 * @return string
 */
public function escapeJs($string)

encodes Unicode อักขระ JavaScript เป็นต้นกลายเป็น \u2665ใช้มันเพื่อหลบหนีการส่งออกภายในสตริง JS สำหรับอินไลน์ Javascript (เช่นonclickแอตทริบิวต์), escapeHtmlAttr()คุณยังคงต้องโทร

หมายเหตุว่าถ้าคุณใช้json_encode()มันแล้วไม่หนีเดียวกันในกรณีนี้escapeJs()จะต้องไม่ถูกนำมาใช้

escapeCss ()

( ตั้งแต่ Magento 2.2 )

/**
 * Escape string for the CSS context
 *
 * @param string $string
 * @return string
 */
public function escapeCss($string)

เข้ารหัสอักขระ unicode สำหรับ CSS (ดูescapeJs()) ตัวอย่างเช่นเพื่อใช้ในcontentแอตทริบิวต์ CSS

วิธีการเลิกใช้ (ณ Magento 2.2):

  • escapeJsQuote: ใช้escapeHtmlAttr()แทน
  • escapeXssInUrl: ใช้escapeUrl()แทน
  • escapeQuote: ใช้escapeHtmlAttr()แทน

1
ทำได้ดีมากฉันได้เพิ่มหมายเหตุเล็กน้อยในคำตอบเพื่ออ้างอิงถึงคุณเมื่อใช้ 2.1 น่าสนใจ Magento U couse พูดถึงวิธีการที่ฉันพูดถึงในคำตอบของฉันเท่านั้น ฉันเดาว่าหลักสูตรนี้เป็นเพียง 2.0
ราฟาเอลที่ Pianism ดิจิตอล

escapeHtmlAttrและescapeHtmlAttrไม่มีอยู่ใน 2.1.2 ... อย่างน้อยไม่ได้อยู่ในนั้น/vendor/magento/framework/Escaper.phpเว้นแต่พวกเขาจะเพิ่มในภายหลังและติดแท็ก magento อีกครั้ง
OZZIE

2
จับได้ดีคำตอบของฉันตามสาขาพัฒนาล่าสุด ตาม devdocs วิธีอื่น ๆ จะถูกคัดค้านจาก 2.2
Fabian Schmengler

มีวิธีที่สามารถใช้ทำความสะอาด html อันใดอันหนึ่งซึ่งอาจจำเป็นต้องมีแท็ก img อยู่หรือไม่?
Corgalore

ทำความสะอาดในแง่ที่?
Fabian Schmengler

14

นี่สำหรับ Magento 2.0 สำหรับ 2.1 อ้างถึงคำตอบของ Fabian

escapeHtml

ใช้ฟังก์ชั่นนี้ในกรณีของเอาต์พุตสตริงที่ไม่ควรมี HTML

ตัวอย่าง:

<span class='label'><?php echo $block->escapeHtml($block->getLabel()); ?></span>

escapeQuote

ใช้ฟังก์ชั่นนี้ในกรณีของคุณสมบัติ HTML

ตัวอย่าง:

<span class="<?php echo $block->escapeQuote($block->getSpanClass()); ?>">Description</span>

escapeUrl

ใช้ฟังก์ชั่นนี้ในกรณีที่มีเอาต์พุต URL (โดยไม่มีการป้องกัน XSS - การแปลงอักขระเท่านั้น)

ตัวอย่าง:

<a href="<?php echo $block->escapeUrl($block->getUrl()); ?>">Link</a>

escapeXssInUrl

ใช้ฟังก์ชั่นนี้ในกรณีที่มีเอาต์พุต URL (พร้อมการป้องกัน XSS - รวมถึงการสนทนาอักขระ)

ตัวอย่าง:

<a href="<?php echo $block->escapeXssInUrl($block->getUrl()); ?>">Link</a>

สิ่งที่ไม่จำเป็นต้องหลบหนี

  • ประเภทการหล่อและฟังก์ชั่น php count()(ตัวอย่างecho (int)$var)
  • เอาต์พุตในเครื่องหมายคำพูดเดี่ยว (ตัวอย่างecho 'test')
  • เอาต์พุตในเครื่องหมายคำพูดคู่โดยไม่มีตัวแปร (ตัวอย่างecho "test")

__วิธี

อันนี้ใช้สำหรับการแปล ใช้มันเมื่อคุณรู้ว่าสามารถแปลสตริงได้

ตัวอย่างเช่น:

<caption class="table-caption"><?php /* @escapeNotVerified */ echo __('More Information') ?></caption>

งานที่ดี .. rapheal
Amit Bera

1
เราควรหลีกเลี่ยงการแปลทุกคำ__()ด้วยหรือไม่ ฉันเบื่อที่จะวาง/* @escapeNotVerified */ที่ไหนสักแห่ง: /
igloczek

@BartekIgielski ดูคำตอบที่อัปเดตของฉัน __ไม่ใช่เพื่อความปลอดภัย แต่เพื่อวัตถุประสงค์ในการแปล
Raphael at Digital Pianism

1
นอกจากนี้ฉันขอแนะนำให้หลบหนีสตริงที่แปลเช่นecho $this->escapeHtml(__('Text to translate'))
KAndy

2
ขณะนี้มีบันทึกในหน้า devdocs ซึ่งบางวิธีจะถูกปฏิเสธด้วย 2.2 ตรวจสอบให้แน่ใจว่าได้ตรวจสอบอีกครั้งในหน้าความปลอดภัยของเทมเพลต devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/…
Anna Völkl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.