Magento 2: टेम्पलेट सुरक्षा: किस विधि का उपयोग करना है?


29

मुझे पता है कि Magento 2 में टेम्पलेट को सुरक्षित करने के लिए कई तरीके उपलब्ध हैं:

  • $block->escapeHtml()
  • $block->escapeQuote()
  • $block->escapeUrl()
  • $block->escapeXssInUrl()

लेकिन मैं सोच रहा हूँ कि उन तरीकों में से प्रत्येक का उपयोग कब करना है?

जवाबों:


35

AbstractBlockसभी डेलिगेट में भागने के तरीके कॉल करते हैं Magento\Framework\Escaper, इसलिए आपको वहां एक सिंहावलोकन मिलेगा।

आइए सार्वजनिक तरीकों और उनके प्रलेखन को देखें:

escapeHtml ()

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

यह किसी भी आउटपुट के लिए आपकी डिफ़ॉल्ट भागने की विधि होनी चाहिए। कन्वेंशन यह है कि "एचटीएमएल" शामिल नहीं करने वाले सभी तरीकों के परिणाम से बच जाना चाहिए।

escapeHtmlAttr ()

( मैगेंटो 2.2 के बाद से )

/**
 * Escape a string for the HTML attribute context
 *
 * @param string $string
 * @param boolean $escapeSingleQuote
 * @return string
 */
public function escapeHtmlAttr($string, $escapeSingleQuote = true)

उदाहरण के लिए, HTML विशेषता में आउटपुट से बचने के लिए इसका उपयोग करें

title="<?php echo $block->escapeHtmlAttr($title) ?>"

यह HTML से बच जाएगा, लेकिन उद्धरण भी ( ")

डिफ़ॉल्ट रूप से, यह एकल उद्धरण से भी बच जाएगा, इसलिए यह भी काम करता है:

onclick="alert('<?php echo $block->escapeHtmlAttr($message) ?>')"

यदि यह वांछित नहीं है, तो दूसरा पैरामीटर झूठा सेट करें।

escapeUrl ()

/**
 * Escape URL
 *
 * @param string $string
 * @return string
 */
public function escapeUrl($string)

इसका उपयोग URL को आउटपुट करने के लिए किया जा सकता है। यह डिफ़ॉल्ट एचटीएमएल से बच निकलेगा और इसके अतिरिक्त हटा देगा javascript:, vbscript:और data:। यदि आप उपयोगकर्ता द्वारा प्रदान किए गए लिंक में इस तरह यूआरएल को रोकना चाहते हैं, तो आप विधि का उपयोग कर सकते हैं।

Magento 2.1 तक यह सुविधा शामिल नहीं थी और आपको escapeXssInUrl()इसके बजाय उपयोग करने की आवश्यकता थी । उपयोग करने का कोई कारण नहीं था escapeUrl()

अन्यथा, केवल $block->escapeHtmlAttr()URL के लिए उपयोग करें।

encodeUrlParam ()

( मैगेंटो 2.2 के बाद से )

/**
 * Encode URL
 *
 * @param string $string
 * @return string
 */
public function encodeUrlParam($string)

यह पैरामीटर के लिए URL एन्कोडिंग लागू करता है। आंतरिक URL के लिए आपको हमेशा उपयोग करना चाहिए getUrl(), जहां URL एन्कोडिंग आपके लिए पहले से ही है, इसलिए यह केवल तभी आवश्यक है जब आप मैन्युअल रूप से बाहरी URL का निर्माण करते हैं।

escapeJs ()

( मैगेंटो 2.2 के बाद से )

/**
 * Escape string for the JavaScript context
 *
 * @param string $string
 * @return string
 */
public function escapeJs($string)

उदाहरण के लिए, जावास्क्रिप्ट के लिए यूनिकोड वर्णों को एनकोड करता है \u2665जेएस स्ट्रिंग के भीतर आउटपुट से बचने के लिए इसका उपयोग करें । इनलाइन जावास्क्रिप्ट (यानी onclickविशेषताएँ) के लिए, आपको अभी भी कॉल करने की आवश्यकता है escapeHtmlAttr()

ध्यान दें कि यदि आप उपयोग करते हैं json_encode(), तो यह पहले से ही बच रहा है, इस मामले में, escapeJs()इसका उपयोग नहीं किया जाना चाहिए।

escapeCss ()

( मैगेंटो 2.2 के बाद से )

/**
 * Escape string for the CSS context
 *
 * @param string $string
 * @return string
 */
public function escapeCss($string)

CSS (देखें escapeJs()) के लिए यूनिकोड वर्णों को एनकोड करता है , उदाहरण के लिए contentCSS विशेषता में उपयोग किया जाता है ।

पदावनत विधियाँ (Magento 2.2 के रूप में):

  • भागनेजस्क: escapeHtmlAttr()इसके बजाय का उपयोग करें
  • भागने xssInUrl: escapeUrl()इसके बजाय का उपयोग करें
  • भागने के परिणाम: escapeHtmlAttr()इसके बजाय का उपयोग करें

1
अच्छा काम मैंने 2.1 का उपयोग करते समय आपका उल्लेख करने के लिए अपने उत्तर में थोड़ा ध्यान दिया है। दिलचस्प बात यह है कि Magento U couse में केवल उन तरीकों का उल्लेख है जो मैंने अपने उत्तर में बताए हैं। मुझे लगता है कि पाठ्यक्रम केवल 2.0 है
राफेल एट डिजिटल पियानोवाद

escapeHtmlAttrऔर escapeHtmlAttr2.1.2 में मौजूद नहीं है ... कम से कम /vendor/magento/framework/Escaper.phpतब तक नहीं जब तक कि उन्होंने इसे बाद में नहीं जोड़ा और
मैगेंटो को

2
अच्छी पकड़, मेरा जवाब वास्तव में नवीनतम विकसित शाखा पर आधारित था। देवदूतों के अनुसार, अन्य विधियों को 2.2 से हटा दिया जाएगा
फेबियन शेंगलर

क्या कोई ऐसी विधि है जिसका उपयोग html के एक अनियंत्रित टुकड़े को साफ करने के लिए किया जा सकता है जिसमें इसे एक img टैग लगाने की आवश्यकता हो सकती है?
Corgalore

किस अर्थ में स्वच्छ?
फाबियन शेंगलर

14

यह Magento 2.0 के लिए है। 2.1 के लिए, फेबियन के उत्तर को देखें

escapeHtml

एक स्ट्रिंग आउटपुट के मामले में इस फ़ंक्शन का उपयोग करें जिसमें HTML नहीं होना चाहिए।

उदाहरण:

<span class='label'><?php echo $block->escapeHtml($block->getLabel()); ?></span>

escapeQuote

HTML विशेषताओं के मामले में इस फ़ंक्शन का उपयोग करें

उदाहरण:

<span class="<?php echo $block->escapeQuote($block->getSpanClass()); ?>">Description</span>

escapeUrl

URL आउटपुट (XSS रोकथाम के बिना - केवल वर्ण रूपांतरण) के मामले में इस फ़ंक्शन का उपयोग करें

उदाहरण:

<a href="<?php echo $block->escapeUrl($block->getUrl()); ?>">Link</a>

escapeXssInUrl

URL आउटपुट (XSS रोकथाम के साथ - वर्ण वार्तालाप सहित) के मामले में इस फ़ंक्शन का उपयोग करें

उदाहरण:

<a href="<?php echo $block->escapeXssInUrl($block->getUrl()); ?>">Link</a>

भागने की क्या जरूरत नहीं है?

  • टाइपिंग कास्टिंग और php फ़ंक्शन count()(उदाहरण echo (int)$var)
  • एकल उद्धरण (उदाहरण echo 'test') में आउटपुट
  • चर के बिना दोहरे उद्धरण चिह्नों में आउटपुट (उदाहरण echo "test")

__विधि

यह एक अनुवाद प्रयोजनों के लिए प्रयोग किया जाता है। इसका उपयोग तब करें जब आपको पता हो कि एक स्ट्रिंग का अनुवाद किया जा सकता है।

उदाहरण के लिए:

<caption class="table-caption"><?php /* @escapeNotVerified */ echo __('More Information') ?></caption>

अच्छा काम .. Rapheal
अमित बेरा

1
क्या हमें हर अनुवाद से बचना चाहिए __()? मैं /* @escapeNotVerified */हर जगह चिपकाने से थोड़ा थक गया हूं : /
igloczek

@BartekIgielski मेरा अद्यतन उत्तर देखें। __सुरक्षा उद्देश्य के लिए नहीं बल्कि अनुवाद के उद्देश्य से है
राफेल एट डिजिटल पियानोवाद

1
इसके अलावा मैं अनुवादित स्ट्रिंग्स से बचने की सलाह देता हूं, जैसेecho $this->escapeHtml(__('Text to translate'))
कांडी

2
वर्तमान में devdocs पेज पर एक नोट है कि कुछ तरीकों को 2.2 से हटा दिया जाएगा। टेम्पलेट सुरक्षा पृष्ठ पर वापस जाँच करना सुनिश्चित करें। devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/…
अन्ना वोकल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.