ฉันทราบว่าวีโอไอพี 2 มีหลายวิธีที่จะรักษาความปลอดภัยของเทมเพลต:
$block->escapeHtml()
$block->escapeQuote()
$block->escapeUrl()
$block->escapeXssInUrl()
แต่ฉันสงสัยว่าจะใช้วิธีเหล่านี้เมื่อใด
ฉันทราบว่าวีโอไอพี 2 มีหลายวิธีที่จะรักษาความปลอดภัยของเทมเพลต:
$block->escapeHtml()
$block->escapeQuote()
$block->escapeUrl()
$block->escapeXssInUrl()
แต่ฉันสงสัยว่าจะใช้วิธีเหล่านี้เมื่อใด
คำตอบ:
วิธีการหลบหนีในการAbstractBlock
โทรแบบมอบหมายทั้งหมดMagento\Framework\Escaper
ดังนั้นคุณจะพบภาพรวมที่นั่น
ลองดูวิธีการสาธารณะและเอกสารประกอบ:
/**
* 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" จะต้องได้รับการยกเว้น
( ตั้งแต่ 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) ?>')"
ตั้งค่าพารามิเตอร์ที่สองเป็นเท็จหากไม่ต้องการ
/**
* 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
( ตั้งแต่ Magento 2.2 )
/**
* Encode URL
*
* @param string $string
* @return string
*/
public function encodeUrlParam($string)
สิ่งนี้ใช้การเข้ารหัส URL กับพารามิเตอร์ สำหรับ URL ภายในคุณควรใช้ทุกgetUrl()
ครั้งที่การเข้ารหัส URL เสร็จสิ้นแล้วสำหรับคุณดังนั้นนี่เป็นสิ่งจำเป็นเฉพาะเมื่อคุณสร้าง URL ภายนอกด้วยตนเอง
( ตั้งแต่ 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()
จะต้องไม่ถูกนำมาใช้
( ตั้งแต่ Magento 2.2 )
/**
* Escape string for the CSS context
*
* @param string $string
* @return string
*/
public function escapeCss($string)
เข้ารหัสอักขระ unicode สำหรับ CSS (ดูescapeJs()
) ตัวอย่างเช่นเพื่อใช้ในcontent
แอตทริบิวต์ CSS
escapeHtmlAttr()
แทนescapeUrl()
แทนescapeHtmlAttr()
แทนescapeHtmlAttr
และescapeHtmlAttr
ไม่มีอยู่ใน 2.1.2 ... อย่างน้อยไม่ได้อยู่ในนั้น/vendor/magento/framework/Escaper.php
เว้นแต่พวกเขาจะเพิ่มในภายหลังและติดแท็ก magento อีกครั้ง
นี่สำหรับ 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>
count()
(ตัวอย่างecho (int)$var
)echo 'test'
)echo "test"
)__
วิธีอันนี้ใช้สำหรับการแปล ใช้มันเมื่อคุณรู้ว่าสามารถแปลสตริงได้
ตัวอย่างเช่น:
<caption class="table-caption"><?php /* @escapeNotVerified */ echo __('More Information') ?></caption>
__()
ด้วยหรือไม่ ฉันเบื่อที่จะวาง/* @escapeNotVerified */
ที่ไหนสักแห่ง: /
__
ไม่ใช่เพื่อความปลอดภัย แต่เพื่อวัตถุประสงค์ในการแปล
echo $this->escapeHtml(__('Text to translate'))