Có một trình trợ giúp Magento tích hợp để thoát dữ liệu mẫu xuất ra để ngăn XSS không?
Hay tôi chỉ nên sử dụng PHP htmlspecialchars
hoặc các htmlentities
hàm?
Có một trình trợ giúp Magento tích hợp để thoát dữ liệu mẫu xuất ra để ngăn XSS không?
Hay tôi chỉ nên sử dụng PHP htmlspecialchars
hoặc các htmlentities
hàm?
Câu trả lời:
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_Abstract
như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 htmlspecialchars
cá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()
và urlEscape()
ủng hộ các phương thức mới và quên đi quoteEscape()
và jsQuoteEscape()
.
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 sprintf
với PHP
Ví dụ.
<?php $foo = 'rocks'; ?>
<?php echo $this->__('Sonassi %s', $foo); ?>
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'); ?>
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ế.
$this->__('Hello %s', '<script>alert("XSS!")</script>')
.
Các lớp Mage_Core_Block_Abstract
và Mage_Core_Helper_Abstract
cả hai đều sử dụng cùng một hàm Mage_Core_Helper_Abstract::escapeHtml
và 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.