नहीं, यह संभव नहीं है कि फ़ायरफ़ॉक्स 21, क्रोम 27, या IE 10. में दिए गए मानों []
या {}
कंस्ट्रक्टर्स पर कब्जा कर लिया जाए , यहाँ http://www.thespanner.co.uk में वर्णित मुख्य हमलों के आधार पर एक छोटा परीक्षण पृष्ठ है । / 2011/05/30 / json-hijacking / :
( http://jsfiddle.net/ph3Uv/2/ )
var capture = function() {
var ta = document.querySelector('textarea')
ta.innerHTML = '';
ta.appendChild(document.createTextNode("Captured: "+JSON.stringify(arguments)));
return arguments;
}
var original = Array;
var toggle = document.body.querySelector('input[type="checkbox"]');
var toggleCapture = function() {
var isOn = toggle.checked;
window.Array = isOn ? capture : original;
if (isOn) {
Object.defineProperty(Object.prototype, 'foo', {set: capture});
} else {
delete Object.prototype.foo;
}
};
toggle.addEventListener('click', toggleCapture);
toggleCapture();
[].forEach.call(document.body.querySelectorAll('input[type="button"]'), function(el) {
el.addEventListener('click', function() {
document.querySelector('textarea').innerHTML = 'Safe.';
eval(this.value);
});
});
<div><label><input type="checkbox" checked="checked"> Capture</label></div>
<div><input type="button" value="[1, 2]" /> <input type="button" value="Array(1, 2);" /> <input type="button" value="{foo: 'bar'}" /> <input type="button" value="({}).foo = 'bar';" /></div>
<div><textarea></textarea></div>
यह ओवरराइड करता है window.Array
और Object.prototype.foo
छोटे और लंबे रूपों के माध्यम से सरणियों और वस्तुओं को आरम्भ करने के लिए एक सेटर जोड़ता है और परीक्षण करता है।
ES4 कल्पना , खंड 1.5 में, कार्यान्वयन मिसाल में और नोट्स "ऑब्जेक्ट और सरणी के वैश्विक, मानक बाइंडिंग वस्तु और सरणी initializers के लिए नई वस्तुओं का निर्माण करने के लिए इस्तेमाल किया जा करने की आवश्यकता है" है कि "इंटरनेट एक्सप्लोरर 6, ओपेरा 9.20, और सफ़ारी 3 करते ऑब्जेक्ट और एरे के स्थानीय या वैश्विक रिबंडिंग का सम्मान नहीं करते हैं, लेकिन मूल ऑब्जेक्ट और एरे बिल्डरों का उपयोग करते हैं। " इसे ES5, सेक्शन 11.1.4 में बरकरार रखा गया है ।
एलन विर्फ़्स-ब्रॉक ने बताया कि ES5 यह भी निर्दिष्ट करता है कि ऑब्जेक्ट इनिशियलाइज़ेशन को सेटर को ट्रिगर नहीं करना चाहिए, क्योंकि यह DefineOwnProperty का उपयोग करता है। MDN: ऑब्जेक्ट्स के साथ कार्य करना, जो "जावास्क्रिप्ट 1.8.1 में शुरू होता है, ऑब्जेक्ट और सरणी आरंभीजरों में गुण सेट करते समय बसने वालों को अब नहीं बुलाया जाता है।" यह वी 8 के मुद्दे 1015 में संबोधित किया गया था ।