क्लाइंट साइड पर HTML को सैनिटाइज / रिवाइज करें


82

मुझे क्रॉस डोमेन अनुरोधों के माध्यम से लोड किए गए बाहरी संसाधनों को प्रदर्शित करने की आवश्यकता है और केवल " सुरक्षित " सामग्री को प्रदर्शित करना सुनिश्चित करें ।

स्क्रिप्ट ब्लॉक हटाने के लिए प्रोटोटाइप के स्ट्रिंग # स्ट्रिपस्क्रिप्स का उपयोग कर सकते हैं । लेकिन हैंडलर जैसे हैं onclickया onerrorअभी भी हैं।

क्या कोई पुस्तकालय है जो कम से कम हो सकता है

  • पट्टी स्क्रिप्ट ब्लॉक,
  • डोम हैंडलर को मार डालो,
  • काले सूचीबद्ध टैग (जैसे: embedया object) को हटा दें ।

तो क्या कोई जावास्क्रिप्ट संबंधित लिंक और उदाहरण हैं?


12
उन उत्तरों पर भरोसा न करें, जो नियमित भाव से ऐसा कर सकते हैं। stackoverflow.com/questions/1732348/…
मिको ओकटामा


यह कैसे सुरक्षित है? क्या उपयोगकर्ता किसी पृष्ठ की जावास्क्रिप्ट को संपादित नहीं कर सकते हैं?
डैनियल का कहना है कि मोनिका

जब तक आप भरोसेमंद उपयोगकर्ताओं द्वारा गलतियों को रोकने की कोशिश नहीं कर रहे हैं, हाँ, यह 'सुरक्षित' नहीं है।
स्कॉट

जवाबों:


112

अपडेट २०१६: काजा सैनिटाइजर पर आधारित एक गूगल क्लोजर पैकेज है।

इसमें एक क्लीनर एपीआई है, जिसे आधुनिक ब्राउज़रों पर उपलब्ध एपीआई को ध्यान में रखते हुए फिर से लिखा गया है, और क्लोजर कंपाइलर के साथ बेहतर तरीके से बातचीत करता है।


बेशर्म प्लग: एक क्लाइंट साइड HTML सैनिटाइजर के लिए caja / plugin / html-sanitizer.js देखें जिसे अच्छी तरह से रिव्यू किया गया है।

यह श्वेत-सूचीबद्ध है, ब्लैक-लिस्टेड नहीं है, लेकिन श्वेतसूची CajWhitelists के अनुसार विन्यास योग्य है


यदि आप सभी टैग हटाना चाहते हैं, तो निम्न कार्य करें:

var tagBody = '(?:[^"\'>]|"[^"]*"|\'[^\']*\')*';

var tagOrComment = new RegExp(
    '<(?:'
    // Comment body.
    + '!--(?:(?:-*[^->])*--+|-?)'
    // Special "raw text" elements whose content should be elided.
    + '|script\\b' + tagBody + '>[\\s\\S]*?</script\\s*'
    + '|style\\b' + tagBody + '>[\\s\\S]*?</style\\s*'
    // Regular name
    + '|/?[a-z]'
    + tagBody
    + ')>',
    'gi');
function removeTags(html) {
  var oldHtml;
  do {
    oldHtml = html;
    html = html.replace(tagOrComment, '');
  } while (html !== oldHtml);
  return html.replace(/</g, '&lt;');
}

लोग आपको बताएंगे कि आप एक तत्व बना सकते हैं, और असाइन कर सकते हैं innerHTMLऔर फिर innerTextया प्राप्त कर सकते हैं textContent, और फिर उस में संस्थाओं से बच सकते हैं। ऐसा मत करो। यह XSS इंजेक्शन के लिए असुरक्षित है क्योंकि हैंडलर <img src=bogus onerror=alert(1337)>चला जाएगा onerrorभले ही नोड डोम से जुड़ा नहीं हो।


5
शानदार, ऐसा लगता है कि यहाँ थोड़ा प्रलेखन है: code.google.com/p/google-caja/wiki/JsHtmlSanitizer
tmcw

3
काजा एचटीएमएल सैनिटाइज़र कोड बहुत अच्छा लगता है, लेकिन इसके लिए कुछ गोंद कोड (पड़ोसी cssparser.js, लेकिन अधिक महत्वपूर्ण बात, html4वस्तु) की आवश्यकता होती है। इसके अतिरिक्त, यह वैश्विक windowसंपत्ति को प्रदूषित करता है। क्या इस कोड का वेब संस्करण है? यदि नहीं, तो क्या आप इसके लिए एक अलग परियोजना बनाने की तुलना में उत्पादन करने और बनाए रखने का एक बेहतर तरीका देखते हैं?
फ़िहग

1
@phihag, google- caja- चर्चा में पूछें और वे आपको एक पैकेज में इंगित कर सकते हैं। मेरा मानना ​​है कि विंडो ऑब्जेक्ट प्रदूषण बैकवर्ड संगतता के लिए है, और इसलिए किसी भी नए पैकेज संस्करण की आवश्यकता नहीं हो सकती है।
माइक शमूएल

1
वेबब्रोज़र्स के लिए पहले से ही एक पैकेज है।
फ़िहाग

2
@phihag वह पैकेज नोडज के लिए है, ब्राउजर के लिए नहीं।
जेफरी टू

40

Google काजा HTML सैनिटाइज़र को वेब वर्कर में एम्बेड करके "वेब-रेडी" बनाया जा सकता है । सैनिटाइज़र द्वारा पेश किए गए किसी भी वैश्विक चर को कार्यकर्ता के भीतर समाहित किया जाएगा, साथ ही प्रसंस्करण अपने स्वयं के धागे में होता है।

वेब वर्कर्स का समर्थन नहीं करने वाले ब्राउज़र के लिए, हम सैनिटाइज़र में काम करने के लिए एक अलग वातावरण के रूप में एक आइफ्रेम का उपयोग कर सकते हैं। टिमोथी चिएन में एक पॉलीफ़िल है जो वेब वर्कर्स को अनुकरण करने के लिए आइफ्रेम का उपयोग करता है, ताकि वह हिस्सा हमारे लिए किया जाए।

काजा परियोजना के पास एक स्टैंडअलोन क्लाइंट-साइड सैनिटाइज़र के रूप में काजा का उपयोग करने का एक विकी पृष्ठ है :

  • स्रोत की जाँच करें, फिर चलाकर निर्माण करें ant
  • शामिल करें html-sanitizer-minified.jsया html-css-sanitizer-minified.jsअपने पृष्ठ में
  • कॉल html_sanitize(...)

कार्यकर्ता स्क्रिप्ट को केवल उन निर्देशों का पालन करने की आवश्यकता है:

importScripts('html-css-sanitizer-minified.js'); // or 'html-sanitizer-minified.js'

var urlTransformer, nameIdClassTransformer;

// customize if you need to filter URLs and/or ids/names/classes
urlTransformer = nameIdClassTransformer = function(s) { return s; };

// when we receive some HTML
self.onmessage = function(event) {
    // sanitize, then send the result back
    postMessage(html_sanitize(event.data, urlTransformer, nameIdClassTransformer));
};

(सिमुलेटर लाइब्रेरी को काम करने के लिए थोड़ा और कोड की आवश्यकता है, लेकिन यह इस चर्चा के लिए महत्वपूर्ण नहीं है।)

डेमो: https://dl.dropbox.com/u/291406/html-sanitize/demo.html


बहुत बढ़िया जवाब। जेफरी, क्या आप बता सकते हैं कि एक वेब कर्मचारी को स्वच्छता का काम क्यों करना चाहिए?
ऑस्टिन वांग

@AustinWang वेब कार्यकर्ता कड़ाई से आवश्यक नहीं हैं, लेकिन चूंकि स्वच्छता अनिवार्य रूप से कम्प्यूटेशनल रूप से महंगी हो सकती है और इसके लिए उपयोगकर्ता से बातचीत की आवश्यकता नहीं है, यह कार्य के लिए अच्छी तरह से अनुकूल है। (मैंने मुख्य उत्तर में वैश्विक चर युक्त भी उल्लेख किया है।)
जेफ़री टू

मुझे इस लाइब्रेरी के लिए सभ्य दस्तावेज़ नहीं मिल रहे हैं। मैं तत्वों और विशेषताओं के अपने श्वेतसूची को कहाँ / कैसे निर्दिष्ट करूँ?
AsGoodAsItGets

@AsGoodAsItGets जैसा कि वर्तमान संस्करण में एक टिप्पणी द्वारा वर्णित है , nameIdClassTransformerप्रत्येक HTML नाम, तत्व आईडी और कक्षाओं की सूची के लिए कहा जाता है; लौटने nullसे विशेषता नष्ट हो जाएगी। Src / com / google / caja / lang / html में JSON फ़ाइलों को संपादित करके आप यह भी कस्टमाइज़ कर सकते हैं कि कौन से तत्व और विशेषताओं को सफेद किया गया है।
जेफरी को

@JefferyTo मुझे खेद है, शायद मैं बहुत गूंगा हूं, लेकिन मुझे नहीं मिला। आपके द्वारा उल्लेखित JSON फाइलें आपके उदाहरण और उपर्युक्त डेमो में उपयोग नहीं की जाती हैं। मैं एक ब्राउज़र में लाइब्रेरी का उपयोग करना चाहता हूं, इसलिए मैंने आपके डेमो को देखा। क्या आप nameIdClassTranformerसभी <script>टैग को अस्वीकार करने <b>और <i>टैग को स्वीकार करने के लिए ऊपर दिए गए फ़ंक्शन को संशोधित कर सकते हैं ?
AsGoodAsItGates 13:15

20

क्लाइंट पर कभी भरोसा न करें। यदि आप एक सर्वर एप्लिकेशन लिख रहे हैं, तो मान लें कि क्लाइंट हमेशा अस्वाभाविक, दुर्भावनापूर्ण डेटा सबमिट करेगा। यह अंगूठे का एक नियम है जो आपको परेशानी से बाहर रखेगा। यदि आप कर सकते हैं, तो मैं आपको सर्वर कोड में सभी सत्यापन और स्वच्छता करने की सलाह दूंगा, जिसे आप जानते हैं (एक उचित डिग्री के साथ)। शायद आप अपने क्लाइंटसाइड कोड के लिए प्रॉक्सी के रूप में सर्वरसाइड वेब एप्लिकेशन का उपयोग कर सकते हैं, जो कि 3 जी पार्टी से प्राप्त होता है और ग्राहक को भेजने से पहले स्वच्छता करता है?

[संपादित करें] मुझे क्षमा करें, मैंने प्रश्न को गलत समझा। हालांकि, मैं अपनी सलाह से खड़ा हूं। यदि आप उन्हें भेजने से पहले सर्वर पर sanitize करते हैं तो आपके उपयोगकर्ता शायद सुरक्षित हो जाएंगे।


19
दरअसल, नोड की लोकप्रियता बढ़ने के साथ, एक जावास्क्रिप्ट समाधान एक सर्वरसाइड समाधान भी हो सकता है। इस तरह मैं कम से कम यहाँ समाप्त हुआ। फिर भी, यह जीने के लिए उत्कृष्ट सलाह है।
निकोलस फ्लायंट

15

अब जब सभी प्रमुख ब्राउज़र सैंडबॉक्स वाले आइफ्रेम का समर्थन करते हैं, तो बहुत सरल तरीका है जो मुझे लगता है कि सुरक्षित हो सकता है। मुझे यह अच्छा लगेगा अगर इस उत्तर की समीक्षा ऐसे लोगों द्वारा की जा सकती है जो इस तरह के सुरक्षा मुद्दे से अधिक परिचित हैं।

नोट: यह विधि निश्चित रूप से IE 9 और पूर्व में काम नहीं करेगी। सैंडबॉक्सिंग का समर्थन करने वाले ब्राउज़र संस्करणों के लिए यह तालिका देखें । (ध्यान दें: तालिका यह कहती है कि यह ओपेरा मिनी में काम नहीं करेगा, लेकिन मैंने अभी इसकी कोशिश की, और यह काम कर गया।)

जावास्क्रिप्ट अक्षम के साथ एक छिपी हुई आइफ्रेम बनाने के लिए विचार है, अपने अविश्वसनीय एचटीएमएल को इसमें पेस्ट करें, और इसे पार्स करें। फिर आप डोम ट्री पर चल सकते हैं और उन टैग्स और विशेषताओं को कॉपी कर सकते हैं जिन्हें सुरक्षित माना जाता है।

यहां दिखाए गए श्वेतसूची केवल उदाहरण हैं। श्वेतसूची के लिए सबसे अच्छा क्या अनुप्रयोग पर निर्भर करेगा। यदि आपको केवल टैग और विशेषताओं के श्वेतसूची की तुलना में अधिक परिष्कृत नीति की आवश्यकता है, तो इसे इस विधि द्वारा समायोजित किया जा सकता है, हालांकि इस उदाहरण कोड द्वारा नहीं।

var tagWhitelist_ = {
  'A': true,
  'B': true,
  'BODY': true,
  'BR': true,
  'DIV': true,
  'EM': true,
  'HR': true,
  'I': true,
  'IMG': true,
  'P': true,
  'SPAN': true,
  'STRONG': true
};

var attributeWhitelist_ = {
  'href': true,
  'src': true
};

function sanitizeHtml(input) {
  var iframe = document.createElement('iframe');
  if (iframe['sandbox'] === undefined) {
    alert('Your browser does not support sandboxed iframes. Please upgrade to a modern browser.');
    return '';
  }
  iframe['sandbox'] = 'allow-same-origin';
  iframe.style.display = 'none';
  document.body.appendChild(iframe); // necessary so the iframe contains a document
  iframe.contentDocument.body.innerHTML = input;

  function makeSanitizedCopy(node) {
    if (node.nodeType == Node.TEXT_NODE) {
      var newNode = node.cloneNode(true);
    } else if (node.nodeType == Node.ELEMENT_NODE && tagWhitelist_[node.tagName]) {
      newNode = iframe.contentDocument.createElement(node.tagName);
      for (var i = 0; i < node.attributes.length; i++) {
        var attr = node.attributes[i];
        if (attributeWhitelist_[attr.name]) {
          newNode.setAttribute(attr.name, attr.value);
        }
      }
      for (i = 0; i < node.childNodes.length; i++) {
        var subCopy = makeSanitizedCopy(node.childNodes[i]);
        newNode.appendChild(subCopy, false);
      }
    } else {
      newNode = document.createDocumentFragment();
    }
    return newNode;
  };

  var resultElement = makeSanitizedCopy(iframe.contentDocument.body);
  document.body.removeChild(iframe);
  return resultElement.innerHTML;
};

आप इसे यहाँ आज़मा सकते हैं

ध्यान दें कि मैं इस उदाहरण में शैली विशेषताओं और टैग को अस्वीकार कर रहा हूं। यदि आपने उन्हें अनुमति दी है, तो आप शायद CSS को पार्स करना चाहते हैं और सुनिश्चित करें कि यह आपके उद्देश्यों के लिए सुरक्षित है।

मैंने इसे कई आधुनिक ब्राउज़रों (क्रोम 40, फ़ायरफ़ॉक्स 36 बीटा, आईई 11, क्रोम फॉर एंड्रॉइड) पर और एक पुराने एक (आईई 8) पर परीक्षण किया है ताकि यह सुनिश्चित किया जा सके कि यह किसी भी स्क्रिप्ट को निष्पादित करने से पहले जमानत हो। मुझे यह जानने में दिलचस्पी होगी कि क्या कोई ब्राउज़र है जो इसके साथ परेशान है, या किसी भी किनारे के मामले हैं जो मैं देख रहा हूं।


10
यह पोस्ट विशेषज्ञों का ध्यान आकर्षित करने के योग्य है, क्योंकि यह स्पष्ट और सरल समाधान है। क्या यह वास्तव में सुरक्षित है?
pwray

आप प्रोग्रामेटिक रूप से एक छिपा हुआ आइफ्रेम "जावास्क्रिप्ट अक्षम के साथ" कैसे बना सकते हैं? मेरे सर्वश्रेष्ठ ज्ञान के लिए यह असंभव है। मिनट आप करते हैं iframe.contentDocument.body.innerHTML = input, जो भी स्क्रिप्ट टैग वहाँ निष्पादित किया जाएगा।
असगोडएट्स इट्स

@AsGoodAsItGets - iframes पर सैंडबॉक्स विशेषता देखें।
aldel

1
@aldel वास्तव में, मैं इसके बारे में नहीं जानता था। हमारे लिए यह IE9 में समर्थन की कमी के कारण अभी भी एक नहीं है। मुझे लगता है कि आपका समाधान काम कर सकता है, लेकिन मुझे लगता है कि आपको अपनी प्रतिक्रिया में स्पष्ट करना चाहिए कि आप sandboxविशेषता पर निर्भर हैं ।
AsGoodAsItGates

क्षमा करें, मुझे लगा कि मेरे उद्घाटन से स्पष्ट था "अब जब सभी प्रमुख ब्राउज़र सैंडबॉक्स वाले आइफ्रेम का समर्थन करते हैं"। मैं एक कम सूक्ष्म नोट जोड़ूंगा।
aldel

12

आप हर संभव अजीब प्रकार के विकृत मार्कअप का अनुमान नहीं लगा सकते हैं कि कुछ ब्राउज़र ब्लैक लिस्ट करने से बचने के लिए कहीं यात्रा कर सकते हैं, इसलिए ब्लैकलिस्ट न करें। कई और संरचनाएं हैं जिन्हें आपको केवल स्क्रिप्ट / एम्बेड / ऑब्जेक्ट और हैंडलर से निकालने की आवश्यकता हो सकती है।

इसके बजाय HTML को तत्वों और विशेषताओं में पदानुक्रम में पार्स करने का प्रयास करें, फिर सभी तत्वों और विशेषता नामों को एक न्यूनतम-न्यूनतम-संभव श्वेतसूची के विरुद्ध चलाएं। एक श्वेतसूची के माध्यम से आपके द्वारा बताई गई किसी भी URL विशेषताएँ की जाँच करें (याद रखें कि केवल जावास्क्रिप्ट :) की तुलना में अधिक खतरनाक प्रोटोकॉल हैं।

यदि इनपुट अच्छी तरह से गठित XHTML है तो ऊपर का पहला भाग बहुत आसान है।

हमेशा की तरह HTML स्वच्छता के साथ, यदि आप इसे करने से बचने का कोई अन्य तरीका खोज सकते हैं, तो इसके बजाय ऐसा करें। कई, कई संभावित छेद हैं। यदि कई वर्षों के बाद भी प्रमुख वेबमेल सेवाएं अभी भी शोषण पा रही हैं, तो आपको क्या लगता है कि आप बेहतर कर सकते हैं?


11

इसलिए, यह 2016 है, और मुझे लगता है कि हम में से कई npmअब हमारे कोड में मॉड्यूल का उपयोग कर रहे हैं। sanitize-htmlnpm पर अग्रणी विकल्प की तरह लगता है, हालांकि अन्य हैं

इस प्रश्न के अन्य उत्तर अपने स्वयं के रोल करने के तरीके में बहुत अच्छा इनपुट प्रदान करते हैं, लेकिन यह एक मुश्किल पर्याप्त समस्या है कि अच्छी तरह से परीक्षण किए गए सामुदायिक समाधान संभवतः सबसे अच्छा उत्तर हैं।

स्थापित करने के लिए कमांड लाइन पर इसे चलाएं: npm install --save sanitize-html

ES5: var sanitizeHtml = require('sanitize-html'); // ... var sanitized = sanitizeHtml(htmlInput);

ES6: import sanitizeHtml from 'sanitize-html'; // ... let sanitized = sanitizeHtml(htmlInput);


10
2018 यहाँ, यह बहुत भारी है (निर्भरता का आधा मेगाबाइट)
user1464581

2020 यहाँ, सैनिटाइज़-html नोड के लिए है और अभी भी ब्राउज़रों के लिए कोई अच्छा विकल्प नहीं है जहाँ तक मैं बता सकता हूँ
मीक

3

[अस्वीकरण: मैं लेखकों में से एक हूं]

हमने इसके लिए एक "वेब-ओनली" (यानी "एक ब्राउज़र की आवश्यकता है") ओपन सोर्स लाइब्रेरी, https://github.com/jitbit/HtmlSanitizertags/attributes/styles लिखा है जो "श्वेतसूची" को छोड़कर सभी को हटा देता है।

उपयोग:

var input = HtmlSanitizer.SanitizeHtml("<script> Alert('xss!'); </scr"+"ipt>");

PS "शुद्ध जावास्क्रिप्ट" समाधान की तुलना में बहुत तेजी से काम करता है क्योंकि यह DOM को पार्स और हेरफेर करने के लिए ब्राउज़र का उपयोग करता है। यदि आप "शुद्ध JS" समाधान में रुचि रखते हैं, तो कृपया https://github.com/punkave/sanitize-html (संबद्ध नहीं) आज़माएं


2

ऊपर सुझाई गई Google काजा लाइब्रेरी को वेब एप्लिकेशन के लिए मेरी परियोजना में कॉन्फ़िगर करने और शामिल करने का तरीका बहुत जटिल था (इसलिए, ब्राउज़र पर चल रहा है)। इसके बजाय मैंने इसका सहारा लिया, क्योंकि हम पहले से ही CKEditor घटक का उपयोग करते हैं, इसका उपयोग बिल्ट-इन HTML सैनिटाइजिंग और श्वेतसूची में किया जाता है, जिसे कॉन्फ़िगर करना कहीं अधिक आसान है। तो, आप एक छिपे हुए iframe में CKEditor उदाहरण लोड कर सकते हैं और कुछ ऐसा कर सकते हैं:

CKEDITOR.instances['myCKEInstance'].dataProcessor.toHtml(myHTMLstring)

अब, यदि आप अपनी परियोजना में CKEditor का उपयोग नहीं कर रहे हैं, तो यह एक ओवरकिल का एक सा हो सकता है, क्योंकि घटक स्वयं लगभग आधा मेगाबाइट (न्यूनतम) है, लेकिन यदि आपके पास स्रोत हैं, तो शायद आप कोड को अलग कर सकते हैं श्वेतसूची ( CKEDITOR.htmlParser) और इसे बहुत छोटा करें।

http://docs.ckeditor.com/#//api

http://docs.ckeditor.com/#!/api/CKEDITOR.htmlDataProcessor


0

मैं आपके जीवन के बाहर के ढांचे को काटने की सलाह देता हूं, यह लंबी अवधि में आपके लिए चीजों को अत्यधिक आसान बना देगा।

क्लोनऑनोड: एक नोड का क्लोनिंग उसके सभी गुणों और उनके मूल्यों की प्रतिलिपि बनाता है, लेकिन ईवेंट श्रोताओं की नकल नहीं करता है

https://developer.mozilla.org/en/DOM/Node.cloneNode

निम्नलिखित परीक्षण नहीं किया गया है, हालांकि मैं पिछले कुछ समय से ट्रेवल्कर्स का उपयोग कर रहा हूं और वे जावास्क्रिप्ट के सबसे अधूरे भागों में से एक हैं। यहां उन नोड प्रकारों की एक सूची दी गई है जिन्हें आप क्रॉल कर सकते हैं, आमतौर पर मैं SHOW_ELEMENT या SHOW_TEXT का उपयोग करता हूं

http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html#Traversal-NodeFilter

function xhtml_cleaner(id)
{
 var e = document.getElementById(id);
 var f = document.createDocumentFragment();
 f.appendChild(e.cloneNode(true));

 var walker = document.createTreeWalker(f,NodeFilter.SHOW_ELEMENT,null,false);

 while (walker.nextNode())
 {
  var c = walker.currentNode;
  if (c.hasAttribute('contentEditable')) {c.removeAttribute('contentEditable');}
  if (c.hasAttribute('style')) {c.removeAttribute('style');}

  if (c.nodeName.toLowerCase()=='script') {element_del(c);}
 }

 alert(new XMLSerializer().serializeToString(f));
 return f;
}


function element_del(element_id)
{
 if (document.getElementById(element_id))
 {
  document.getElementById(element_id).parentNode.removeChild(document.getElementById(element_id));
 }
 else if (element_id)
 {
  element_id.parentNode.removeChild(element_id);
 }
 else
 {
  alert('Error: the object or element \'' + element_id + '\' was not found and therefore could not be deleted.');
 }
}

5
यह कोड मानता है कि साफ करने के लिए इनपुट पहले ही पार्स कर दिया गया है और यहां तक ​​कि दस्तावेज पेड़ में डाला गया है। यदि ऐसा है, तो दुर्भावनापूर्ण स्क्रिप्ट पहले ही निष्पादित की जा चुकी हैं। इनपुट एक स्ट्रिंग होना चाहिए।
फ़िहग

इसके बाद एक DOM फ्रैग्मेंट भेजें, सिर्फ इसलिए कि यह किसी दिए गए आकार या फॉर्म में DOM में है, वास्तव में इसका मतलब यह नहीं है कि इसे निष्पादित किया गया है। यह मानते हुए कि वह इसे AJAX के माध्यम से लोड कर रहा है वह इसे आयात के साथ संयोजन के रूप में उपयोग कर सकता है।
जॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.