Tôi biết Magento 2 có sẵn một số phương thức để bảo mật mẫu:
$block->escapeHtml()
$block->escapeQuote()
$block->escapeUrl()
$block->escapeXssInUrl()
Nhưng tôi đang tự hỏi khi nào nên sử dụng từng phương pháp đó?
Tôi biết Magento 2 có sẵn một số phương thức để bảo mật mẫu:
$block->escapeHtml()
$block->escapeQuote()
$block->escapeUrl()
$block->escapeXssInUrl()
Nhưng tôi đang tự hỏi khi nào nên sử dụng từng phương pháp đó?
Câu trả lời:
Các phương thức thoát trong AbstractBlock
tất cả các cuộc gọi của đại biểu đến Magento\Framework\Escaper
, vì vậy bạn sẽ tìm thấy một cái nhìn tổng quan ở đó.
Hãy xem các phương pháp công khai và tài liệu của họ:
/**
* 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)
Đây phải là phương thức thoát mặc định của bạn cho bất kỳ đầu ra nào. Quy ước là kết quả của tất cả các phương thức không chứa "Html" phải được thoát.
( kể từ 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)
Sử dụng điều này để thoát đầu ra trong một thuộc tính HTML, ví dụ
title="<?php echo $block->escapeHtmlAttr($title) ?>"
Nó sẽ thoát HTML, nhưng cũng trích dẫn ( "
)
Theo mặc định, nó cũng sẽ thoát các dấu ngoặc đơn, do đó, điều này cũng hoạt động:
onclick="alert('<?php echo $block->escapeHtmlAttr($message) ?>')"
Đặt tham số thứ hai thành false nếu điều này là không mong muốn.
/**
* Escape URL
*
* @param string $string
* @return string
*/
public function escapeUrl($string)
Điều này có thể được sử dụng để xuất URL. Nó sẽ áp dụng lối thoát HTML mặc định và thêm vào đó javascript:
, vbscript:
và data:
. Nếu bạn muốn ngăn chặn các URL như thế này trong các liên kết do người dùng cung cấp, bạn có thể sử dụng phương pháp này.
Cho đến khi Magento 2.1 tính năng này không được bao gồm và bạn cần sử dụng escapeXssInUrl()
thay thế. Không có lý do để sử dụng escapeUrl()
cả.
Nếu không, chỉ sử dụng $block->escapeHtmlAttr()
cho URL.
( kể từ Magento 2.2 )
/**
* Encode URL
*
* @param string $string
* @return string
*/
public function encodeUrlParam($string)
Điều này áp dụng mã hóa URL cho các tham số. Đối với các URL nội bộ bạn phải luôn sử dụng getUrl()
, trong đó việc mã hóa URL đã được thực hiện cho bạn, vì vậy điều này chỉ cần thiết nếu bạn tự tạo một URL bên ngoài.
( kể từ Magento 2.2 )
/**
* Escape string for the JavaScript context
*
* @param string $string
* @return string
*/
public function escapeJs($string)
Mã hóa các ký tự unicode cho JavaScript, ví dụ ♥
trở thành \u2665
. Sử dụng nó để thoát đầu ra trong một chuỗi JS . Đối với Javascript nội tuyến (tức là onclick
thuộc tính), bạn vẫn cần gọi escapeHtmlAttr()
.
Lưu ý rằng nếu bạn sử dụng json_encode()
, nó đã thực hiện thoát tương tự, trong trường hợp này, escapeJs()
không được sử dụng.
( kể từ Magento 2.2 )
/**
* Escape string for the CSS context
*
* @param string $string
* @return string
*/
public function escapeCss($string)
Mã hóa các ký tự unicode cho CSS (xem escapeJs()
), ví dụ được sử dụng trong content
thuộc tính CSS.
escapeHtmlAttr()
thay thếescapeUrl()
thay thếescapeHtmlAttr()
thay thếescapeHtmlAttr
và escapeHtmlAttr
không tồn tại trong 2.1.2 ... ít nhất là không tồn tại /vendor/magento/framework/Escaper.php
trừ khi họ đã thêm nó sau đó và được gắn thẻ lại magento ..
Đây là phiên bản dành cho Magento 2.0. Đối với 2.1, hãy tham khảo câu trả lời của Fabian
escapeHtml
Sử dụng chức năng này trong trường hợp đầu ra chuỗi không chứa HTML.
Thí dụ:
<span class='label'><?php echo $block->escapeHtml($block->getLabel()); ?></span>
escapeQuote
Sử dụng chức năng này trong trường hợp thuộc tính HTML
Thí dụ:
<span class="<?php echo $block->escapeQuote($block->getSpanClass()); ?>">Description</span>
escapeUrl
Sử dụng chức năng này trong trường hợp đầu ra URL (không có ngăn chặn XSS - chỉ chuyển đổi ký tự)
Thí dụ:
<a href="<?php echo $block->escapeUrl($block->getUrl()); ?>">Link</a>
escapeXssInUrl
Sử dụng chức năng này trong trường hợp đầu ra URL (có ngăn XSS - bao gồm cả hội thoại ký tự)
Thí dụ:
<a href="<?php echo $block->escapeXssInUrl($block->getUrl()); ?>">Link</a>
count()
(ví dụ echo (int)$var
)echo 'test'
)echo "test"
)__
phương phápCái này được sử dụng cho mục đích dịch thuật. Sử dụng nó khi bạn biết một chuỗi có thể được dịch.
Ví dụ:
<caption class="table-caption"><?php /* @escapeNotVerified */ echo __('More Information') ?></caption>
__()
? Tôi hơi mệt khi dán /* @escapeNotVerified */
ở khắp mọi nơi: /
__
không phải vì mục đích bảo mật mà vì mục đích dịch thuật
echo $this->escapeHtml(__('Text to translate'))