(संपादित यह जवाब आपके पूर्व-संपादन प्रश्न से संबंधित है। किसी भी स्क्रिप्ट भाषाओं के बारे में पता नहीं है, जावास्क्रिप्ट का उपयोग कर लागू किया, हालांकि मैं उम्मीद वहाँ कुछ कर रहे हैं।उदाहरण के लिए, एक बिंदु पर किसी ने जावास्क्रिप्ट के लिए बेसिक लिखा था (एक लिंक था, लेकिन यह rotted)। इस उत्तर का शेष इसलिए बहुत अकादमिक है, लेकिन मैंने इसे केवल चर्चा, चित्रण और यहां तक कि सावधानी के उद्देश्यों के लिए छोड़ दिया है। इसके अलावा, मैं निश्चित रूप से bobince's points — से सहमत इस खुद नहीं करते हैं, Caja के रूप में दूसरों के काम, इस तरह का उपयोग करें।)
आप उपयोगकर्ता द्वारा निर्मित सामग्री में किसी भी पटकथा के लिए अनुमति देते हैं, तो सच है कि आप करेंगे के लिए तैयार हो अपने संरक्षण तंत्र में छेद ढूंढने और उनका शोषण करने वाले लोगों की एक हथियार दौड़ में प्रवेश करें, और आप उन शोषणों का जवाब देते हैं। मुझे लगता है कि मैं शायद इससे दूर शर्मिंदा हूं, लेकिन आप अपने समुदाय और दुर्व्यवहार से निपटने के लिए अपने विकल्पों को जानते हैं। तो अगर आपको लगता है कि के लिए तैयार कर रहे हैं:
जिस तरह से है कि जावास्क्रिप्ट प्रतीक संकल्प करता है के
, यह की तरह लगता है यह एक संदर्भ में, जहां window
, document
, ActiveXObject
, XMLHttpRequest
में एक स्क्रिप्ट का मूल्यांकन करने के लिए संभव हो सकता है, और इसी तरह के डॉन ' टी अपने सामान्य अर्थ है:
// Define the scoper
var Scoper = (function() {
var rv = {};
rv.scope = function(codeString) {
var window,
document,
ActiveXObject,
XMLHttpRequest,
alert,
setTimeout,
setInterval,
clearTimeout,
clearInterval,
Function,
arguments;
// etc., etc., etc.
// Just declaring `arguments` doesn't work (which makes
// sense, actually), but overwriting it does
arguments = undefined;
// Execute the code; still probably pretty unsafe!
eval(codeString);
};
return rv;;
})();
// Usage:
Scoper.scope(codeString);
(अब जब कि बुराई eval
का उपयोग करता है, लेकिन मैं तुरंत एक तरह से eval
का उपयोग किए बिना डिफ़ॉल्ट वस्तुओं क्रॉस-ब्राउज़र परछाई की नहीं सोच सकते हैं, और आप तो प्राप्त नहीं हो वैसे भी पाठ के रूप में कोड ...)
लेकिन यह काम नहीं करता है, यह केवल आंशिक समाधान (नीचे अधिक) है। तर्क यह है कि codeString
में window
(उदाहरण के लिए) तक पहुंचने के लिए कोड के भीतर कोई भी प्रयास स्थानीय चर window
तक पहुंच जाएगा, न कि वैश्विक; और दूसरों के लिए भी यही है। दुर्भाग्यवश, जिस तरह से प्रतीकों का समाधान किया जाता है, window
की किसी भी संपत्ति को window.
उपसर्ग (उदाहरण के लिए alert
) के साथ या उसके बिना एक्सेस किया जा सकता है, इसलिए आपको उनको भी सूचीबद्ध करना होगा। यह एक लंबी सूची हो सकती है, कम से कम नहीं क्योंकि bobince अंक बताते हैं, आईई किसी भी डीओएम तत्व को नाम या आईडी के साथ window
पर डंप करता है। तो आपको शायद इसे अपने स्वयं के आईफ्रेम में रखना होगा ताकि आप के आसपास एक रन-रन कर सकें जो समस्या है और "केवल" को मानक सामग्री से निपटना होगा। यह भी ध्यान दें कि मैंने scope
किसी ऑब्जेक्ट की प्रॉपर्टी कैसे बनाई है, और फिर आप केवल इसे संपत्ति के माध्यम से कॉल करते हैं। ऐसा इसलिए है कि this
Scoper
उदाहरण पर सेट किया गया है (अन्यथा, कच्चे फ़ंक्शन कॉल पर, this
window
पर डिफ़ॉल्ट!)।
लेकिन, जैसा कि बॉबन्स बताते हैं, चीजों को पाने के लिए कई अलग-अलग तरीके हैं।
(new ('hello'.constructor.constructor)('alert("hello from global");'))()
अब, हो सकता है आप जेल कि विशिष्ट बनाने के लिए (अद्यतन सकता काम नहीं शोषण सभी — सब पर constructor
गुणों के साथ के बारे में mucking: उदाहरण के लिए, codeString
में इस कोड को सफलतापूर्वक ऊपर जेल टूट जाता है अंतर्निहित वस्तुओं के —), लेकिन मुझे शक है। और अगर आप , किसी को (बॉब) की तरह बस एक नया के साथ आते हैं सकता है शोषण, इस तरह:
(function(){return this;})().alert("hello again from global!");
इसलिए "हथियारों की दौड़।"
ऐसा करने का एकमात्र वास्तव में पूरा तरीका आपके साइट पर एक उचित जावास्क्रिप्ट पार्सर बनाया जाएगा, उनके कोड को पार्स करें और अवैध पहुंच की जांच करें, और केवल तभी कोड चलाएं। यह बहुत काम है, लेकिन अपने यूज-केस यह सही ठहराते हैं, तो ...
आप स्क्रिप्ट को चलाने के लिए कहां जाना चाहते हैं? ब्राउज़र में या सर्वर पर? –
@Aaron, ब्राउज़र में – TiansHUo