Magento 2: bảo mật mẫu: sử dụng phương pháp nào?


29

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:


35

Các phương thức thoát trong AbstractBlocktấ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ọ:

escHtml ()

/**
 * 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.

escHtmlAttr ()

( 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.

escUrl ()

/**
 * 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: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.

mã hóaUrlParam ()

( 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.

escJs ()

( 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à onclickthuộ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.

escCss ()

( 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 contentthuộc tính CSS.

Các phương pháp không dùng nữa (kể từ Magento 2.2):

  • escJsQuote: Sử dụng escapeHtmlAttr()thay thế
  • escXssInUrl: Sử dụng escapeUrl()thay thế
  • escQuote: Sử dụng escapeHtmlAttr()thay thế

1
Làm tốt lắm, tôi đã thêm một lưu ý nhỏ vào câu trả lời của mình để đề cập đến bạn khi sử dụng 2.1. Thật thú vị, Magouse U couse chỉ đề cập đến các phương pháp tôi đã đề cập trong câu trả lời của tôi. Tôi đoán khóa học chỉ có 2.0
Raphael tại Digital Pianism

escapeHtmlAttrescapeHtmlAttrkhông tồn tại trong 2.1.2 ... ít nhất là không tồn tại /vendor/magento/framework/Escaper.phptrừ khi họ đã thêm nó sau đó và được gắn thẻ lại magento ..
OZZIE

2
Bắt tốt, câu trả lời của tôi thực sự dựa trên nhánh phát triển mới nhất. Theo các devdocs, các phương pháp khác sẽ không được chấp nhận từ 2.2
Fabian Schmengler

Có một phương pháp nào có thể được sử dụng để dọn sạch một đoạn html tùy ý có thể cần phải có thẻ img trong đó không?
Corgalore

Sạch theo nghĩa nào?
Fabian Schmengler

14

Đâ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>

Những gì không cần thoát?

  • Nhập hàm và hàm php count()(ví dụ echo (int)$var)
  • Đầu ra trong dấu ngoặc đơn (ví dụ echo 'test')
  • Đầu ra trong dấu ngoặc kép không có biến (ví dụ echo "test")

các __phương pháp

Cá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>

công việc tốt .. rapheal
Amit Bera

1
Chúng ta cũng nên thoát khỏi mọi bản dịch __()? Tôi hơi mệt khi dán /* @escapeNotVerified */ở khắp mọi nơi: /
igloczek

@BartekIgielski xem câu trả lời cập nhật của tôi. __không phải vì mục đích bảo mật mà vì mục đích dịch thuật
Raphael tại Digital Pianism

1
Ngoài ra tôi khuyên bạn nên thoát các chuỗi dịch, nhưecho $this->escapeHtml(__('Text to translate'))
KAndy

2
Hiện tại có một lưu ý trên trang devdocs rằng một số phương thức sẽ không được chấp nhận với 2.2. Hãy chắc chắn kiểm tra lại trên trang bảo mật mẫu. devdocs.magento.com/guides/v2.0/frontend-dev-guide/tem mẫu / Đổi
Anna Völkl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.