จะหลีกเลี่ยงข้อมูลเอาต์พุตได้อย่างไร


27

มีตัวช่วย Magento ในตัวเพื่อหลีกเลี่ยงข้อมูลแม่แบบที่ส่งออกเพื่อป้องกัน XSS หรือไม่

หรือฉันควรใช้ PHP htmlspecialcharsหรือhtmlentitiesฟังก์ชั่น?


หากคุณกำลังมองหา Magento 2 โปรดอ้างถึงmagento.stackexchange.com/q/156368/243
Fabian Schmengler

คำตอบ:


33

มีวิธีการช่วยเหลือหลายวิธีขึ้นอยู่กับบริบท ทั้งหมดถูกกำหนดไว้Mage_Core_Helper_Abstractแต่ยังอยู่ในMage_Core_Block_Abstractดังนั้นคุณสามารถใช้พวกเขากับ$this->...()ในทุกแม่แบบ:

  • escapeHtml(): จริง ๆ แล้วมันใช้ประโยชน์จากhtmlspecialcharsพารามิเตอร์ที่แนะนำเพื่อหลบหนี HTML: $result = htmlspecialchars($result, ENT_COMPAT, 'UTF-8', false);- นอกจากนี้คุณสามารถระบุรายการที่อนุญาตของแท็กที่อนุญาตและเรียกวิธีการในอาร์เรย์เพื่อหลบหนีองค์ประกอบทั้งหมดในครั้งเดียว ใช้สิ่งนี้สำหรับข้อความอินไลน์ใด ๆ
  • quoteEscape(): รุ่นที่เรียบง่ายโดยไม่ต้องรายการที่อนุญาตและประมวลผลที่หลากหลาย แต่คนนี้หนีราคาเดียวเช่นเดียวกับคำพูดคู่ที่มีประโยชน์สำหรับข้อความภายในแอตทริบิวต์แบบ HTML
  • jsQuoteEscape(): อันนี้หนีเครื่องหมายคำพูดเดี่ยวด้วยแบ็กสแลช มันถูกใช้เพื่อหลบหนีตัวอักษรสตริงใน 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()


jsQuoteEscape ปลอดภัยหรือไม่? ดูเหมือน str_replace ($ quote, '\\'. $ quote, ... ) ไม่ทำงาน ... gist.github.com/xxorax/1c9653fd59785085f96d4f676bc64ee2
Xorax

@Xaxax เป็นจุดที่ดีมาก ฉันจะอัปเดตคำตอบ
Fabian Schmengler

21

เพียงแปลมัน

คุณควรใช้ฟังก์ชันแปลมาตรฐานเสมอ

ในอินสแตนซ์บล็อก

<?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()ควรใช้แทน
barell

5
หมายเหตุสำคัญอื่น ๆ : การแปลไม่ได้ช่วยอะไรเลย ลองดูสิ: $this->__('Hello %s', '<script>alert("XSS!")</script>').
เฟเบียน Schmengler

3

คลาสMage_Core_Block_AbstractและMage_Core_Helper_Abstractทั้งคู่ใช้ฟังก์ชั่นเดียวกันMage_Core_Helper_Abstract::escapeHtmlและการใช้งานของมันนั้นใช้ฟังก์ชั่น PHP htmlspecialchars นอกเหนือจากการใช้ตรรกะ aditional สำหรับอาร์เรย์ที่มีเนื้อหา HTML

ฟังก์ชั่นนี้สามารถเข้าถึงได้ในทุกคลาสของ block และ helper ผ่าน $ this และเนื่องจากฟังก์ชั่นนี้เป็นแบบสาธารณะคุณสามารถใช้มันผ่าน Mage :: helper ('core') หรือคลาส helper อื่น ๆ ได้ทุกที่


-1

สำหรับการแปลงภาษาสเปน:

$value = str_replace(array("&lt;", "&gt;"), array("<", ">"), htmlspecialchars("Lorem ipsum &gt;", ENT_COMPAT, "UTF-8", false));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.