Làm thế nào để thoát dữ liệu đầu ra?


Câu trả lời:


33

Có một số phương pháp trợ giúp tùy thuộc vào bối cảnh. Tất cả được định nghĩa trong Mage_Core_Helper_Abstractnhưng cũng trong Mage_Core_Block_Abstract, vì vậy bạn có thể sử dụng chúng $this->...()trong mọi mẫu:

  • escapeHtml(): Nó thực sự tận dụng htmlspecialcharscác tham số được đề xuất để thoát HTML: $result = htmlspecialchars($result, ENT_COMPAT, 'UTF-8', false);- ngoài ra, bạn có thể chỉ định danh sách trắng các thẻ được phép và gọi phương thức trên một mảng để thoát tất cả các phần tử cùng một lúc. Sử dụng này cho bất kỳ văn bản nội tuyến.
  • quoteEscape(): một phiên bản đơn giản hơn không có danh sách trắng và xử lý mảng nhưng phiên bản này thoát khỏi dấu ngoặc đơn cũng như dấu ngoặc kép, hữu ích cho văn bản trong thuộc tính HTML .
  • jsQuoteEscape(): cái này thoát khỏi dấu ngoặc đơn với dấu gạch chéo ngược. Nó được sử dụng để thoát chuỗi ký tự trong JavaScript. Nhưng điều này không an toàn . (Ví dụ bởi @Xorax :) 'test\\\'+alert("powned");//'. Việc thoát thêm dấu gạch chéo ngược là cần thiết. Sử dụng quoteEscape()thay thế!
  • escapeUrl(): Tôi không biết tại sao phương thức này tồn tại, nó không phải là chuỗi mã hóa URL, nó chỉ đơn giản là cũ htmlspecialchars()mà không có bất kỳ tham số nào. Đừng sử dụng nó. Không bao giờ.

    /**
     * Escape html entities in url
     *
     * @param string $data
     * @return string
     */
    public function escapeUrl($data)
    {
        return htmlspecialchars($data);
    }
  • Trên một lưu ý liên quan, có một urlEncode()điều cũng không áp dụng mã hóa URL, nhưng thay vào đó, Base64 ... Đừng sử dụng nó, nếu bạn không biết chính xác những gì bạn cần.

    /**
     *  base64_encode() for URLs encoding
     *
     *  @param    string $url
     *  @return   string
     */
    public function urlEncode($url)
    {
        return strtr(base64_encode($url), '+/=', '-_,');
    }

Vâng, việc đặt tên không nhất quán. Một khi tất cả các tên phương thức đó đã tuân theo lược đồ somethingEscape()nhưng sau đó ai đó đã quyết định từ chối htmlEscape()urlEscape()ủng hộ các phương thức mới và quên đi quoteEscape()jsQuoteEscape().


jsQuoteEscape có thực sự an toàn? Nhìn như str_replace ($ quote, '\\' $ quote, ....) Không thực hiện công việc ... gist.github.com/xxorax/1c9653fd59785085f96d4f676bc64ee2
Xorax

@Xorax điểm rất tốt. Tôi sẽ cập nhật câu trả lời.
Fabian Schmengler

21

Chỉ cần dịch nó

Bạn phải luôn luôn sử dụng chức năng dịch tiêu chuẩn

Trong một trường hợp khối

<?php echo $this->__('Text goes here'); ?>

Bất cứ nơi nào khác

<?php echo Mage::helper('core')->__('Text goes here'); ?>

Và sử dụng nó giống như cách bạn sẽ sử dụng sprintfvới PHP

Ví dụ.

<?php $foo = 'rocks'; ?>
<?php echo $this->__('Sonassi %s', $foo); ?>

Hoặc thoát khỏi nó

Trong một trường hợp khối

<?php echo $this->escapeHtml('HTML goes here'); ?>

Bất cứ nơi nào khác

Sử dụng Mage/Core/Helper/Abstract.php

escapeHtml($data, $allowedTags = null)

Ví dụ.

<?php echo Mage::helper('core')->escapeHtml('HTML goes here'); ?>

Lưu ý quan trọng: Mage_Core_Block_Abstract::htmlEscape()không được dùng trong Magento v 1.4.0.0-rc1 và Mage_Core_Block_Abstract::escapeHtml()nên được sử dụng thay thế.
barell

5
Một lưu ý quan trọng khác: Dịch thuật không thoát khỏi bất cứ điều gì . Hãy dùng thử : $this->__('Hello %s', '<script>alert("XSS!")</script>').
Fabian Schmengler 6/2/2015

3

Các lớp Mage_Core_Block_AbstractMage_Core_Helper_Abstractcả hai đều sử dụng cùng một hàm Mage_Core_Helper_Abstract::escapeHtmlvà nó thực thi sử dụng hàm htmlspecialchars của PHP bên cạnh việc triển khai một số logic quảng cáo cho các mảng có nội dung HTML.

Hàm này có thể được truy cập trong tất cả các lớp khối và trình trợ giúp thông qua $ this và vì hàm này là công khai nên bạn có thể sử dụng nó thông qua Mage :: helper ('core') hoặc một số lớp trợ giúp khác, ở mọi nơi khác.


-1

Đối với người Tây Ban Nha chuyển đổi:

$value = str_replace(array("&lt;", "&gt;"), array("<", ">"), htmlspecialchars("Lorem ipsum &gt;", ENT_COMPAT, "UTF-8", false));
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.