มีตัวช่วย Magento ในตัวเพื่อหลีกเลี่ยงข้อมูลแม่แบบที่ส่งออกเพื่อป้องกัน XSS หรือไม่
หรือฉันควรใช้ PHP htmlspecialchars
หรือhtmlentities
ฟังก์ชั่น?
มีตัวช่วย Magento ในตัวเพื่อหลีกเลี่ยงข้อมูลแม่แบบที่ส่งออกเพื่อป้องกัน XSS หรือไม่
หรือฉันควรใช้ PHP htmlspecialchars
หรือhtmlentities
ฟังก์ชั่น?
คำตอบ:
มีวิธีการช่วยเหลือหลายวิธีขึ้นอยู่กับบริบท ทั้งหมดถูกกำหนดไว้Mage_Core_Helper_Abstract
แต่ยังอยู่ในMage_Core_Block_Abstract
ดังนั้นคุณสามารถใช้พวกเขากับ$this->...()
ในทุกแม่แบบ:
escapeHtml()
: จริง ๆ แล้วมันใช้ประโยชน์จากhtmlspecialchars
พารามิเตอร์ที่แนะนำเพื่อหลบหนี HTML: $result = htmlspecialchars($result, ENT_COMPAT, 'UTF-8', false);
- นอกจากนี้คุณสามารถระบุรายการที่อนุญาตของแท็กที่อนุญาตและเรียกวิธีการในอาร์เรย์เพื่อหลบหนีองค์ประกอบทั้งหมดในครั้งเดียว ใช้สิ่งนี้สำหรับข้อความอินไลน์ใด ๆquoteEscape()
: รุ่นที่เรียบง่ายโดยไม่ต้องรายการที่อนุญาตและประมวลผลที่หลากหลาย แต่คนนี้หนีราคาเดียวเช่นเดียวกับคำพูดคู่ที่มีประโยชน์สำหรับข้อความภายในแอตทริบิวต์แบบ HTMLjsQuoteEscape()
: อันนี้หนีเครื่องหมายคำพูดเดี่ยวด้วยแบ็กสแลช มันถูกใช้เพื่อหลบหนีตัวอักษรสตริงใน JavaScript แต่นี้เป็นไม่ได้ที่เชื่อถือได้ (ตัวอย่างโดย @Xorax: 'test\\\'+alert("powned");//'
) จำเป็นต้องหลบหนีจากแบ็กสแลชเพิ่มเติม ใช้quoteEscape()
แทน!escapeUrl()
: ฉันไม่รู้ว่าทำไมวิธีนี้จึงมีอยู่มันไม่ใช่สายอักขระเข้ารหัส URL แต่เป็นแบบเก่าธรรมดาhtmlspecialchars()
โดยไม่มีพารามิเตอร์ใด ๆ อย่าใช้มัน เคย
/**
* Escape html entities in url
*
* @param string $data
* @return string
*/
public function escapeUrl($data)
{
return htmlspecialchars($data);
}
ในบันทึกที่เกี่ยวข้องมีสิ่งurlEncode()
ที่ไม่ได้ใช้การเข้ารหัส URL แต่ base64 แทน ... อย่าใช้มันหากคุณไม่ทราบว่าคุณต้องการสิ่งใด
/**
* base64_encode() for URLs encoding
*
* @param string $url
* @return string
*/
public function urlEncode($url)
{
return strtr(base64_encode($url), '+/=', '-_,');
}
ใช่การตั้งชื่อไม่สอดคล้องกัน เมื่อทุกคนชื่อวิธีกำลังตามโครงการsomethingEscape()
แต่แล้วใครบางคนตัดสินใจที่จะเลิกhtmlEscape()
และurlEscape()
ในความโปรดปรานของวิธีการใหม่และลืมเกี่ยวกับและquoteEscape()
jsQuoteEscape()
คุณควรใช้ฟังก์ชันแปลมาตรฐานเสมอ
ในอินสแตนซ์บล็อก
<?php echo $this->__('Text goes here'); ?>
ที่ไหนก็ได้
<?php echo Mage::helper('core')->__('Text goes here'); ?>
และใช้แบบเดียวกับที่คุณจะใช้sprintf
กับ PHP
เช่น.
<?php $foo = 'rocks'; ?>
<?php echo $this->__('Sonassi %s', $foo); ?>
ในอินสแตนซ์บล็อก
<?php echo $this->escapeHtml('HTML goes here'); ?>
ที่ไหนก็ได้
การใช้ Mage/Core/Helper/Abstract.php
escapeHtml($data, $allowedTags = null)
เช่น.
<?php echo Mage::helper('core')->escapeHtml('HTML goes here'); ?>
Mage_Core_Block_Abstract::htmlEscape()
เลิกใช้ตั้งแต่ Magento v 1.4.0.0-rc1 และMage_Core_Block_Abstract::escapeHtml()
ควรใช้แทน
$this->__('Hello %s', '<script>alert("XSS!")</script>')
.
คลาสMage_Core_Block_Abstract
และMage_Core_Helper_Abstract
ทั้งคู่ใช้ฟังก์ชั่นเดียวกันMage_Core_Helper_Abstract::escapeHtml
และการใช้งานของมันนั้นใช้ฟังก์ชั่น PHP htmlspecialchars นอกเหนือจากการใช้ตรรกะ aditional สำหรับอาร์เรย์ที่มีเนื้อหา HTML
ฟังก์ชั่นนี้สามารถเข้าถึงได้ในทุกคลาสของ block และ helper ผ่าน $ this และเนื่องจากฟังก์ชั่นนี้เป็นแบบสาธารณะคุณสามารถใช้มันผ่าน Mage :: helper ('core') หรือคลาส helper อื่น ๆ ได้ทุกที่
สำหรับการแปลงภาษาสเปน:
$value = str_replace(array("<", ">"), array("<", ">"), htmlspecialchars("Lorem ipsum >", ENT_COMPAT, "UTF-8", false));