2010-04-20 13 views
8

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

उदाहरण: इंटरफ़ेस checkanswer(func) है इस अनुमति दी जाती है:

checkanswer(function (x,y)={ 
    return x+y; 
} 

लेकिन इन की अनुमति नहीं है:
alert(1)
document.write("hello world")
eval("alert()")

संपादित करें: मैं क्या दिमाग में था एक साधारण भाषा थी जिसे जावास्क्रिप्ट का उपयोग करके कार्यान्वित किया गया था, http://stevehanov.ca/blog/index.php?id=92

+0

आप स्क्रिप्ट को चलाने के लिए कहां जाना चाहते हैं? ब्राउज़र में या सर्वर पर? –

+0

@Aaron, ब्राउज़र में – TiansHUo

उत्तर

13

(संपादित यह जवाब आपके पूर्व-संपादन प्रश्न से संबंधित है। किसी भी स्क्रिप्ट भाषाओं के बारे में पता नहीं है, जावास्क्रिप्ट का उपयोग कर लागू किया, हालांकि मैं उम्मीद वहाँ कुछ कर रहे हैं।उदाहरण के लिए, एक बिंदु पर किसी ने जावास्क्रिप्ट के लिए बेसिक लिखा था (एक लिंक था, लेकिन यह 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 किसी ऑब्जेक्ट की प्रॉपर्टी कैसे बनाई है, और फिर आप केवल इसे संपत्ति के माध्यम से कॉल करते हैं। ऐसा इसलिए है कि thisScoper उदाहरण पर सेट किया गया है (अन्यथा, कच्चे फ़ंक्शन कॉल पर, thiswindow पर डिफ़ॉल्ट!)।

लेकिन, जैसा कि बॉबन्स बताते हैं, चीजों को पाने के लिए कई अलग-अलग तरीके हैं।

(new ('hello'.constructor.constructor)('alert("hello from global");'))() 

अब, हो सकता है आप जेल कि विशिष्ट बनाने के लिए (अद्यतन सकता काम नहीं शोषण सभी   — सब पर constructor गुणों के साथ के बारे में mucking: उदाहरण के लिए, codeString में इस कोड को सफलतापूर्वक ऊपर जेल टूट जाता है अंतर्निहित वस्तुओं के   —), लेकिन मुझे शक है। और अगर आप , किसी को (बॉब) की तरह बस एक नया के साथ आते हैं सकता है शोषण, इस तरह:

(function(){return this;})().alert("hello again from global!"); 

इसलिए "हथियारों की दौड़।"

ऐसा करने का एकमात्र वास्तव में पूरा तरीका आपके साइट पर एक उचित जावास्क्रिप्ट पार्सर बनाया जाएगा, उनके कोड को पार्स करें और अवैध पहुंच की जांच करें, और केवल तभी कोड चलाएं। यह बहुत काम है, लेकिन अपने यूज-केस यह सही ठहराते हैं, तो ...

+1

प्लस निश्चित रूप से किसी आईडी/नाम के साथ प्रत्येक दस्तावेज़ ऑब्जेक्ट को आईई पर 'विंडो' में डाल दिया जाता है ... मज़ेदार लोगों को फ़िल्टर करना पड़ता है! – bobince

+0

@ बॉबिन: * ब्लीच * हाँ, आपको शायद उपरोक्त को एक आईफ्रेम या उनको संभालने के लिए कुछ जोड़ना होगा, इसलिए आपको "केवल" मानक सामानों के बारे में चिंता करने की ज़रूरत है, नामित/पहचान किए गए तत्व नहीं। (इसके साथ अपडेट किया गया उत्तर, धन्यवाद, हालांकि ऐसा लगता है कि वास्तव में उपयोगकर्ताओं को जावास्क्रिप्ट * का उपयोग करने की अनुमति देना * वह नहीं है जो उसका मतलब था।) –

+1

और फिर स्थानीय क्षेत्र से बचने के लिए 'नया फ़ंक्शन (' ... ')() 'है। यह ब्लॉक नहीं है क्योंकि आप 'फंक्शन' प्राप्त करने के लिए 'कन्स्ट्रक्टर' को पकड़ सकते हैं। और कॉल स्टैक को स्क्रिप्ट करने के लिए 'arguments.caller'; 'तर्क' ओवरराइट नहीं हो सकता है। और कॉलर द्वारा बाद में ऑब्जेक्ट प्रोटोटाइप के साथ झुकाव। और एक ऑब्जेक्ट को 'sStotaged' toString' या गुणों के साथ वापस कर रहा है। और इसी तरह। संक्षेप में: aaaaargh।:-) – bobince

0

लगता है जैसे आपको उपयोगकर्ता दर्ज डेटा को संसाधित करने की आवश्यकता है और एक सफेद सूची या अनुमत सामग्री की ब्लैक-लिस्ट के आधार पर अमान्य मार्क-अप को प्रतिस्थापित करने की आवश्यकता है।

+0

लेकिन यह वही नहीं है जो मैं चाहूंगा, क्योंकि सबसे पहले, इस तरह के पार्सिंग को एन्कोडिंग का उपयोग करके आसानी से घुमाया जा सकता है। जो मैंने दिमाग में था वह एक साधारण भाषा थी जिसे जावास्क्रिप्ट द्वारा व्याख्या किया गया था। – TiansHUo

5

टीजे। पाउडर "हथियारों की दौड़" के बारे में एक उत्कृष्ट बिंदु बनाता है। यह बहुत होने के लिए एक वाटरटाइट सैंडबॉक्स बनाने के लिए कठिन होगा।

कुछ कार्यों को ओवरराइड करना संभव है, हालांकि, काफी आसानी से।

सरल कार्य:

और यदि ब्राउज़र आपको करने की जरूरत में काम करता है this question के अनुसार, document.write की तरह भी अधिभावी चीजों के रूप में सरल रूप में

document.write = function(str) {} 

है समर्थन (मुझे लगता है कि यह उन सभी में काम करता है), यह सबसे अच्छा समाधान हो सकता है।

वैकल्पिक विकल्प:

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

  • स्वीकृत कार्यों की एक सफेद सूची का उपयोग करके उपयोगकर्ता के कोड को पार्स करना। बहुत ही जटिल करने के लिए जटिल है, क्योंकि देखभाल करने के लिए बहुत सारी टिप्पणियां और विविधताएं हैं।

  • परिवर्तनों के लिए डीओएम की निगरानी करने के कई तरीके हैं, और मुझे पूरा यकीन है कि एक तंत्र बनाना संभव है जो किसी भी बदलाव को तुरंत बदल देता है, जो विंडोज के डीएलएल प्रबंधन के समान ही है। लेकिन यह निर्माण और बहुत संसाधन-गहन बनाने के लिए बेहद जटिल होगा।

0

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

3

वास्तव में नहीं। जावास्क्रिप्ट एक बेहद गतिशील भाषा है जिसमें कई छिपी हुई या ब्राउज़र-विशिष्ट विशेषताएं हैं जिनका उपयोग आप किसी भी प्रकार की जेल से बाहर निकलने के लिए कर सकते हैं।

इसे अपने आप पर लेने की कोशिश न करें। Caja जैसे मौजूदा 'मिनी-जेएस-जैसी-भाषा' प्रोजेक्ट का उपयोग करने पर विचार करें।

+0

यदि सैंडबॉक्स को वास्तव में सुरक्षित होना आवश्यक है, तो यह शायद एकमात्र सार्थक तरीका है। –

0

मैं एक और तरीका है: का उपयोग गूगल WorkerPool एपीआई
तैयारी देखें इस
http://code.google.com/apis/gears/api_workerpool.html

एक बनाया कार्यकर्ता डोम के लिए उपयोग नहीं है; दस्तावेज़ और विंडो जैसी वस्तुएं केवल मुख्य पृष्ठ पर मौजूद हैं। यह श्रमिकों का नतीजा किसी भी निष्पादन स्थिति को साझा नहीं करता है। हालांकि, श्रमिकों के पास जावास्क्रिप्ट अंतर्निहित फ़ंक्शंस तक पहुंच है। अधिकांश गियर विधियों का भी उपयोग किया जा सकता है, एक वैश्विक चर के माध्यम से स्वचालित रूप से परिभाषित किया गया है: google.gears.factory। (एक अपवाद लोकलसेवर फ़ाइल सबमिटकर्ता है, जिसके लिए DOM की आवश्यकता है।) अन्य कार्यक्षमता के लिए, बनाए गए श्रमिक अनुरोध करने के लिए मुख्य पृष्ठ पूछ सकते हैं।

0

एक सैंडबॉक्स को लागू करने के लिए इस पैटर्न के बारे में क्या?

function safe(code,args) 
{ 
    if (!args) 
     args=[]; 
    return (function(){ 
    for (i in window) 
     eval("var "+i+";"); 
    return function(){return eval(code);}.apply(0,args); 
    })(); 
} 



ff=function() 
{ 
    return 3.14; 
} 

console.log(safe("this;"));//Number 
console.log(safe("window;"));//undefined 
console.log(safe("console;"));//undefined 
console.log(safe("Math;"));//MathConstructor 
console.log(safe("JSON;"));//JSON 
console.log(safe("Element;"));//undefined 
console.log(safe("document;"));//undefined 
console.log(safe("Math.cos(arguments[0]);",[3.14]));//-0.9999987317275395 
console.log(safe("arguments[0]();",[ff]));//3.14 

देता है कि:

Number 
undefined 
undefined 
MathConstructor 
JSON 
undefined 
undefined 
-0.9999987317275395 
3.14 

आप एक इस समाधान पर हमला करने के उपयुक्त दोहन प्रदान करें कर सकते हैं? बस मेरे ज्ञान को समझने और सुधारने के लिए, बेशक :)

धन्यवाद!

+0

क्या आपने चयनित उत्तर देखा है, इसमें कई शोषण हैं जो वैश्विक वस्तु प्राप्त करेंगे। – TiansHUo

संबंधित मुद्दे