क्या ब्राउज़र में सैंडबॉक्स जावास्क्रिप्ट को चलाना संभव है?


142

मुझे आश्चर्य हो रहा है कि HTML पृष्ठ में चल रहे जावास्क्रिप्ट कोड के लिए सामान्य रूप से उपलब्ध सुविधाओं को रोकने के लिए ब्राउज़र में सैंडबॉक्स जावास्क्रिप्ट चलाना संभव है।

उदाहरण के लिए, मान लें कि मैं अंत उपयोगकर्ताओं के लिए एक जावास्क्रिप्ट एपीआई प्रदान करना चाहता हूं ताकि उन्हें "दिलचस्प घटनाओं" के होने पर इवेंट हैंडलर को परिभाषित करने में मदद मिल सके, लेकिन मैं उन उपयोगकर्ताओं को windowऑब्जेक्ट के गुणों और कार्यों तक नहीं पहुंचना चाहता । क्या मैं ऐसा करने में सक्षम हूं?

सबसे सरल मामले में, मान लें कि मैं उपयोगकर्ताओं को कॉल करने से रोकना चाहता हूं alert। मैं सोच सकता हूं कि कुछ दृष्टिकोण हैं:

  • window.alertविश्व स्तर पर फिर से परिभाषित करें । मुझे नहीं लगता कि यह एक मान्य दृष्टिकोण होगा क्योंकि पृष्ठ में चल रहे अन्य कोड (यानी उनके इवेंट हैंडलर में उपयोगकर्ताओं द्वारा लिखे गए सामान नहीं) का उपयोग करना चाह सकते हैं alert
  • प्रोसेस करने के लिए सर्वर को इवेंट हैंडलर कोड भेजें। मुझे यकीन नहीं है कि प्रोसेस करने के लिए सर्वर को कोड भेजना सही तरीका है क्योंकि पेज के संदर्भ में ईवेंट हैंडलर्स को चलाने की जरूरत है।

शायद एक समाधान जहां सर्वर उपयोगकर्ता परिभाषित फ़ंक्शन को संसाधित करता है और फिर क्लाइंट पर काम करने के लिए कॉलबैक उत्पन्न करता है? भले ही वह दृष्टिकोण कार्य इस समस्या को हल करने के बेहतर तरीके हों?

जवाबों:


54

Google काजा एक स्रोत-से-स्रोत अनुवादक है जो "आपको अपने पृष्ठ में अविश्वसनीय तृतीय-पक्ष HTML और जावास्क्रिप्ट इनलाइन डालने की अनुमति देता है और अभी भी सुरक्षित है।"


5
एक त्वरित परीक्षण से पता चलता है कि काजा ब्राउज़र को सीपीयू के हमलों से बचाने में असमर्थ है जैसे while (1) {}--- यह सिर्फ लटका हुआ है। इसी तरह a=[]; while (1) { a=[a,a]; }
डेविड

5
हां, सेवा से वंचित रहना
Darius Bacon

32

डगलस क्रॉफोर्ड के अस्सेफ़ पर एक नज़र डालें :

ADsafe किसी भी वेब पेज पर गेस्ट कोड (जैसे थर्ड पार्टी स्क्रिप्टेड विज्ञापन या विजेट) डालना सुरक्षित बनाता है। ADsafe जावास्क्रिप्ट के एक सबसेट को परिभाषित करता है जो कि अतिथि कोड को बहुमूल्य इंटरैक्शन करने की अनुमति देने के लिए पर्याप्त शक्तिशाली है, जबकि एक ही समय में दुर्भावनापूर्ण या आकस्मिक क्षति या घुसपैठ को रोकता है। JSLint जैसे टूल द्वारा ADSafe सबसेट को यांत्रिक रूप से सत्यापित किया जा सकता है ताकि सुरक्षा के लिए अतिथि कोड की समीक्षा करने के लिए कोई मानव निरीक्षण आवश्यक न हो। ADsafe सबसेट भी अच्छी कोडिंग प्रथाओं को लागू करता है, जिससे अतिथि कोड सही तरीके से चलने की संभावना बढ़ जाती है।

आप प्रोजेक्ट के GitHub रिपॉजिटरी में template.htmlऔर template.jsफ़ाइलों को देखकर ADsafe का उपयोग कैसे करें, इसका एक उदाहरण देख सकते हैं ।


उनकी साइट पर, मुझे ADsafe का उपयोग करने का कोई तरीका नहीं दिख रहा है। इसे डाउनलोड करने का कोई तरीका नहीं है, कोड का कोई लिंक नहीं है, कुछ भी नहीं। आप ADsafe की कोशिश कैसे कर सकते हैं?
बीटी

2
इसके अलावा, यह किसी भी पहुंच को रोकता है this, जो पूरी तरह से अस्वीकार्य है। आप उपयोग किए बिना अच्छी जावास्क्रिप्ट नहीं लिख सकते this
बीटी

4
@BT का उपयोग किए बिना मैंने पूरी परियोजनाएं लिखी हैं this। खराब नाम वाले पैरामीटर से बचना मुश्किल नहीं है।
sound_typed

2
@BT यह कहना मूर्खतापूर्ण होगा कि वास्तविक दुनिया की परियोजनाओं को पूरा करना अस्वीकार्य है। लेकिन मुझे यह चर्चा शुरू करने पर पछतावा है, और इसे वापस लेना चाहिए; यह ऐसी बातों (खेद) पर चर्चा करने का स्थान नहीं है। यदि आप आगे चर्चा करना चाहते हैं तो मैं ट्विटर पर हूं।
साउंडली_टाइप्ड

1
@BT (मैं इस सवाल के प्रासंगिक होने के बाद से जारी रखूंगा) कभी भी आप किसी और के वातावरण में कोड चलाते हैं जिसे आप नियमों और प्रतिबंधों में चलाएंगे। मैं इसे अस्वीकार्य नहीं कहूंगा। एक "गधा में दर्द", हो सकता है। लेकिन अस्वीकार्य नहीं। आखिरकार, हर उपयोग के लिए this, यह करने के लिए एक समान, बराबर गैर- thisतरीका है (यह सिर्फ एक पैरामीटर है, सब के बाद)।
sound_typed

24

मैंने एक सैंडबॉक्सिंग लाइब्रेरी बनाई जिसे jsandbox कहा जाता है जो सैंडबॉक्स के मूल्यांकन के लिए वेब कर्मचारियों का उपयोग करता है। यह सैंडबॉक्स कोड डेटा को स्पष्ट रूप से देने के लिए एक इनपुट विधि भी है जो अन्यथा प्राप्त करने में सक्षम नहीं होगा।

निम्नलिखित एपीआई का एक उदाहरण है:

jsandbox
    .eval({
      code    : "x=1;Math.round(Math.pow(input, ++x))",
      input   : 36.565010597564445,
      callback: function(n) {
          console.log("number: ", n); // number: 1337
      }
  }).eval({
      code   : "][];.]\\ (*# ($(! ~",
      onerror: function(ex) {
          console.log("syntax error: ", ex); // syntax error: [error object]
      }
  }).eval({
      code    : '"foo"+input',
      input   : "bar",
      callback: function(str) {
          console.log("string: ", str); // string: foobar
      }
  }).eval({
      code    : "({q:1, w:2})",
      callback: function(obj) {
          console.log("object: ", obj); // object: object q=1 w=2
      }
  }).eval({
      code    : "[1, 2, 3].concat(input)",
      input   : [4, 5, 6],
      callback: function(arr) {
          console.log("array: ", arr); // array: [1, 2, 3, 4, 5, 6]
      }
  }).eval({
      code    : "function x(z){this.y=z;};new x(input)",
      input   : 4,
      callback: function(x) {
          console.log("new x: ", x); // new x: object y=4
      }
  });

+1: यह वास्तव में अच्छा लग रहा है। उपयोगकर्ता के कोड को इस तरह निष्पादित करना कितना सुरक्षित है?
कॉन्स्टेंटिन टर्कस

1
बहुत सुरक्षित। जीथब पर अद्यतन पुस्तकालय देखें
एली ग्रे

1
क्या यह परियोजना अभी भी कायम है? मैं देख रहा हूं कि इसे 2 साल से ज्यादा समय से अपडेट नहीं किया गया है ...
यानिक रोचॉन

मुझे यह पसंद है, सिवाय इसके कि अगर आप सैंडबॉक्स करना चाहते हैं लेकिन फिर भी कोड को jQuery कहने की अनुमति देते हैं, तो यह विफल हो जाएगा क्योंकि वेब कार्यकर्ता डोम हेरफेर की अनुमति नहीं देते हैं।
रहली

हाय एली - एक महान परिवाद के लिए धन्यवाद, क्या आप इसे बनाए रखने की योजना बना रहे हैं? मैंने डिबगिंग कार्यक्षमता जोड़ने के लिए एक परिवर्तन अनुरोध किया है - जो कोड को देखकर त्वरित रूप से संभव होना चाहिए। मुझे बताओ कि तुम क्या सोचते हो?
user1514042

8

मुझे लगता है कि jjj यहां ध्यान देने योग्य है। यह एक जावास्क्रिप्ट दुभाषिया है जिसे जावास्क्रिप्ट में लिखा गया है।

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


7

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

http://asvd.github.io/jailed/demos/web/console/


4

सभी ब्राउज़र विक्रेता और HTML5 विनिर्देश सैंडबॉक्स वाले iframes को अनुमति देने के लिए एक वास्तविक सैंडबॉक्स संपत्ति की दिशा में काम कर रहे हैं - लेकिन यह अभी भी iframe ग्रैन्युलैरिटी तक सीमित है।

सामान्य तौर पर, नियमित अभिव्यक्ति की कोई डिग्री, आदि सुरक्षित रूप से मध्यस्थ को प्रदान किए गए उपयोगकर्ता को सुरक्षित नहीं कर सकते क्योंकि यह हॉल्टिंग को कम करता है: / -


2
क्या आप बता सकते हैं कि यह कैसे हॉल्टिंग समस्या को कम करता है
hdgarrood

2
हॉल्टिंग समस्या को हल करने की सिद्धांतिक असंभवता वास्तव में स्थैतिक कोड विश्लेषण पर लागू होती है। सैंडबॉक्स, हॉल्टिंग की समस्या से निपटने के लिए समय सीमा लागू करने जैसे काम कर सकते हैं।
अविनाधा

4

एक फ़ाइल (कोई अतिरिक्त eval.jsफ़ाइल आवश्यक नहीं है) में @ रेयानोहारा के वेब वर्कर सैंडबॉक्स कोड का एक उन्नत संस्करण ।

function safeEval(untrustedCode)
    {
    return new Promise(function (resolve, reject)
    {

    var blobURL = URL.createObjectURL(new Blob([
        "(",
        function ()
            {
            var _postMessage = postMessage;
            var _addEventListener = addEventListener;

            (function (obj)
                {
                "use strict";

                var current = obj;
                var keepProperties = [
                    // required
                    'Object', 'Function', 'Infinity', 'NaN', 'undefined', 'caches', 'TEMPORARY', 'PERSISTENT', 
                    // optional, but trivial to get back
                    'Array', 'Boolean', 'Number', 'String', 'Symbol',
                    // optional
                    'Map', 'Math', 'Set',
                ];

                do {
                    Object.getOwnPropertyNames(current).forEach(function (name) {
                        if (keepProperties.indexOf(name) === -1) {
                            delete current[name];
                        }
                    });

                    current = Object.getPrototypeOf(current);
                }
                while (current !== Object.prototype);
                })(this);

            _addEventListener("message", function (e)
            {
            var f = new Function("", "return (" + e.data + "\n);");
            _postMessage(f());
            });
            }.toString(),
        ")()"], {type: "application/javascript"}));

    var worker = new Worker(blobURL);

    URL.revokeObjectURL(blobURL);

    worker.onmessage = function (evt)
        {
        worker.terminate();
        resolve(evt.data);
        };

    worker.onerror = function (evt)
        {
        reject(new Error(evt.message));
        };

    worker.postMessage(untrustedCode);

    setTimeout(function () {
        worker.terminate();
        reject(new Error('The worker timed out.'));
        }, 1000);
    });
    }

झसे आज़माओ:

https://jsfiddle.net/kp0cq6yw/

var promise = safeEval("1+2+3");

promise.then(function (result) {
      alert(result);
      });

यह आउटपुट 6(क्रोम और फ़ायरफ़ॉक्स में परीक्षण) होना चाहिए ।


2

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

function construct(constructor, args) {
  function F() {
      return constructor.apply(this, args);
  }
  F.prototype = constructor.prototype;
  return new F();
}
// Sanboxer 
function sandboxcode(string, inject) {
  "use strict";
  var globals = [];
  for (var i in window) {
    // <--REMOVE THIS CONDITION
    if (i != "console")
    // REMOVE THIS CONDITION -->
    globals.push(i);
  }
  globals.push('"use strict";\n'+string);
  return construct(Function, globals).apply(inject ? inject : {});
}
sandboxcode('console.log( this, window, top , self, parent, this["jQuery"], (function(){return this;}()));'); 
// => Object {} undefined undefined undefined undefined undefined undefined 
console.log("return of this", sandboxcode('return this;', {window:"sanboxed code"})); 
// => Object {window: "sanboxed code"}

https://gist.github.com/alejandrolechuga/9381781


3
windowउस से वापस पाने के लिए तुच्छ । sandboxcode('console.log((0,eval)("this"))')
Ry-

मुझे यह पता लगाना होगा कि इसे कैसे रोका जाए
alejandro

@alejandro क्या आपने इसे रोकने का कोई तरीका खोजा?
विल्ट

1
मेरा कार्यान्वयन अभी जोड़ता है:function sbx(s,p) {e = eval; eval = function(t){console.log("GOT GOOD")}; sandboxcode(s,p); eval =e}
YoniXw

2
@YoniXw: मुझे आशा है कि आपने इसे किसी भी चीज़ के लिए उपयोग नहीं किया। इस तरह का कोई तरीका कभी काम नहीं करेगा। (_=>_).constructor('return this')()
Ry-

1

एक स्वतंत्र जावास्क्रिप्ट दुभाषिया बिलियन ब्राउज़र कार्यान्वयन के एक बंद संस्करण की तुलना में एक मजबूत सैंडबॉक्स प्राप्त करने की अधिक संभावना है। रेयान ने पहले ही js.js का उल्लेख किया है , लेकिन एक अधिक अद्यतित परियोजना JS-Interpreter हैडॉक्स दुभाषिया के लिए विभिन्न कार्यों का पर्दाफाश करने के लिए कैसे शामिल करते हैं लेकिन इसके दायरे अन्यथा बहुत सीमित है।


1

2019 तक, vm2 इस समस्या का सबसे लोकप्रिय और सबसे नियमित रूप से अद्यतन समाधान की तरह दिखता है।


vm2 ब्राउज़र में रनटाइम का समर्थन नहीं करता है। हालाँकि, यह काम करना चाहिए यदि आप एक नोडज एप्लिकेशन में सैंडबॉक्स कोड देख रहे हैं।
केविन। गले

0

साथ में NISP के आप सैंडबॉक्सिंग मूल्यांकन करने में सक्षम होंगे। हालाँकि आप जो अभिव्यक्ति लिखते हैं वह वास्तव में जेएस नहीं है, इसके बजाय आप एस-एक्सप्रेशन लिखेंगे। साधारण डीएसएल के लिए आदर्श जो व्यापक प्रोग्रामिंग की मांग नहीं करता है।


-3

1) मान लें कि आपके पास निष्पादित करने के लिए एक कोड है:

var sCode = "alert(document)";

अब, मान लीजिए कि आप इसे सैंडबॉक्स में निष्पादित करना चाहते हैं:

new Function("window", "with(window){" + sCode + "}")({});

निष्पादित होने पर ये दो लाइनें विफल हो जाएंगी, क्योंकि "सैंडबॉक्स" से "अलर्ट" फ़ंक्शन उपलब्ध नहीं है

2) और अब आप अपनी कार्यक्षमता के साथ विंडो ऑब्जेक्ट के एक सदस्य को उजागर करना चाहते हैं:

new Function("window", "with(window){" + sCode + "}")({
    'alert':function(sString){document.title = sString}
});

वास्तव में आप भागते हुए उद्धरण जोड़ सकते हैं और अन्य पॉलिशिंग कर सकते हैं, लेकिन मुझे लगता है कि विचार स्पष्ट है।


7
क्या वैश्विक वस्तु प्राप्त करने के लिए अन्य तरीकों के असंख्य नहीं हैं? एक फ़ंक्शन के भीतर उदाहरण के लिए जिसे func.apply (नल) का उपयोग करके बुलाया जाता है, "यह" विंडो ऑब्जेक्ट होगा।
mbarkhau 12

5
पहला उदाहरण विफल नहीं होता है, यह सैंडबॉक्सिंग का एक बहुत ही अमान्य उदाहरण है।
एंडी ई

1
var sCode = "this.alert ('विफल')";
लियोनार्ड पाउली

-4

यह उपयोगकर्ता जावास्क्रिप्ट कहाँ से आ रहा है?

आपके पेज में एक उपयोगकर्ता एम्बेडिंग कोड के बारे में बहुत कुछ नहीं है और फिर इसे अपने ब्राउज़र से कॉल कर सकते हैं (देखें Greasemonkey, http://www.greasespot.net/ )। यह सिर्फ कुछ ब्राउज़र है।

हालाँकि, यदि आप स्क्रिप्ट को किसी डेटाबेस में संग्रहीत करते हैं, तो इसे पुनः प्राप्त करें और इसे निकालें (), तो आप स्क्रिप्ट को चलाने से पहले उसे साफ कर सकते हैं।

कोड के उदाहरण जो सभी विंडो को हटाते हैं। और दस्तावेज़। संदर्भ:

 eval(
  unsafeUserScript
    .replace(/\/\/.+\n|\/\*.*\*\/, '') // Clear all comments
    .replace(/\s(window|document)\s*[\;\)\.]/, '') // removes window. or window; or window)
 )

यह निम्नलिखित को निष्पादित होने से रोकने की कोशिश करता है (परीक्षण नहीं):

window.location = 'http://mydomain.com';
var w = window  ;

असुरक्षित उपयोगकर्ता स्क्रिप्ट पर लागू होने वाली बहुत सी सीमाएँ हैं। दुर्भाग्य से, जावास्क्रिप्ट के लिए कोई 'सैंडबॉक्स कंटेनर' उपलब्ध नहीं है।


2
अगर कोई दुर्भावनापूर्ण कुछ करने की कोशिश कर रहा है तो एक साधारण रेगेक्स बस नहीं कर सकता है - ले (फ़ंक्शन () {यह ["लोका" + "tion"] = " example.com ";}) () सामान्य तौर पर यदि आप अपने उपयोगकर्ताओं पर भरोसा नहीं कर सकते हैं (जो किसी भी साइट के साथ मामला है जिस पर मनमाने लोग सामग्री जोड़ सकते हैं) सभी js को अवरुद्ध करना आवश्यक है।
olliej

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

olliej, आप इस तरह की तकनीक की सीमाओं के बारे में सही हैं। <Code> var window = null, document = null, this = {}; </ code> जैसे ग्लोबल वेरिएबल को ओवरराइट करने के बारे में कैसे?
दिमित्री

दिमित्री जेड, इन चर को अधिलेखित करने की अनुमति नहीं है [कुछ ब्राउज़रों में]। उत्तर की सूची में मेरे समाधान पर भी जांच करें - यह काम करता है।
सर्गेई इलिंस्की

-5

मैं उपयोगकर्ताओं को अपनी साइट के लिए एप्लेट बनाने के लिए एक सरलीकृत जेएस सैंडबॉक्स पर काम कर रहा हूं। हालाँकि मैं अभी भी DOM एक्सेस की अनुमति देने के साथ कुछ चुनौतियों का सामना कर रहा हूं (parentNode मुझे बस चीजों को सुरक्षित रखने की अनुमति नहीं देगा =), मेरा दृष्टिकोण बस अपने कुछ उपयोगी / हानिरहित सदस्यों के साथ विंडो ऑब्जेक्ट को फिर से परिभाषित करने के लिए था, और फिर उपयोगकर्ता को बाहर निकालना () डिफ़ॉल्ट दायरे के रूप में इस पुनर्निर्धारित विंडो के साथ कोड।

मेरा "कोर" कोड इस तरह से जाता है ... (मैं इसे पूरी तरह से नहीं दिखा रहा हूं;)

function Sandbox(parent){

    this.scope = {
        window: {
            alert: function(str){
                alert("Overriden Alert: " + str);
            },
            prompt: function(message, defaultValue){
                return prompt("Overriden Prompt:" + message, defaultValue);
            },
            document: null,
            .
            .
            .
            .
        }
    };

    this.execute = function(codestring){

        // here some code sanitizing, please

        with (this.scope) {
            with (window) {
                eval(codestring);
            }
        }
    };
}

इसलिए, मैं एक सैंडबॉक्स को इंस्टाल कर सकता हूं और कोड रनिंग प्राप्त करने के लिए इसके निष्पादन () का उपयोग कर सकता हूं। इसके अलावा, eval'd कोड के भीतर सभी नए घोषित चर अंततः निष्पादन () दायरे के लिए बाध्य होंगे, इसलिए मौजूदा कोड के साथ नाम क्लैश या गड़बड़ नहीं होंगे।

हालाँकि वैश्विक वस्तुएँ अभी भी प्रशंसनीय हैं, जो सैंडबॉक्स वाले कोड से अज्ञात बने रहना चाहिए उन्हें सैंडबॉक्स :: स्कोप ऑब्जेक्ट में प्रॉक्सी के रूप में परिभाषित किया जाना चाहिए।

उम्मीद है इससे आपका काम बनेगा।


8
यह कुछ भी सैंडबॉक्स नहीं करता है। निकाले गए कोड सदस्यों को हटा सकते हैं और उस तरह से वैश्विक दायरे में ले जा सकते हैं, या (कार्य () {इसे वापस लौटाएं}) द्वारा ghe वैश्विक गुंजाइश के संदर्भ को पकड़ सकते हैं
माइक सैमुअल

-6

आप उपयोगकर्ता के कोड को एक फ़ंक्शन में लपेट सकते हैं जो निषिद्ध वस्तुओं को मापदंडों के रूप में फिर से परिभाषित करता है - ये undefinedतब कहा जाएगा:

(function (alert) {

alert ("uh oh!"); // User code

}) ();

बेशक, चतुर हमलावर जावास्क्रिप्ट डोम का निरीक्षण करके और खिड़की के संदर्भ में एक गैर-ओवरराइड ऑब्जेक्ट को खोजने के लिए इसके चारों ओर प्राप्त कर सकते हैं।


एक अन्य विचार jslint जैसे उपकरण का उपयोग करके उपयोगकर्ता के कोड को स्कैन कर रहा है । सुनिश्चित करें कि यह कोई पूर्व निर्धारित चर नहीं है (या: केवल इच्छित चर), और फिर यदि कोई ग्लोबल्स सेट या एक्सेस किए गए हैं, तो उपयोगकर्ता की स्क्रिप्ट का उपयोग न करें। फिर से, डोम चलने में असुरक्षित हो सकता है - उपयोगकर्ता जो कि शाब्दिक का उपयोग करके निर्माण कर सकते हैं उनके पास विंडो ऑब्जेक्ट के अंतर्निहित संदर्भ हो सकते हैं जिन्हें सैंडबॉक्स से बचने के लिए एक्सेस किया जा सकता है।


2
यदि उपयोगकर्ता ने सादे चेतावनी के बजाय window.alert में प्रवेश किया, तो वे उस सीमा को बायपास कर देंगे।
क्वेंटिन

@ डोरवर्ड: हाँ, इसलिए "निषिद्ध वस्तुएं"। Wrunsby को यह तय करना चाहिए कि उपयोगकर्ता को किन वस्तुओं को एक्सेस करने की अनुमति नहीं है, और उन्हें पैरामीटर सूची में रखें।
जॉन मिलिकिन

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

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