2012-08-31 36 views
27

मुझे अपनी साइट पर उपयोगकर्ता द्वारा सबमिट की गई स्क्रिप्ट्स की सेवा करने की आवश्यकता है (जैसे jsfiddle)। मैं स्क्रिप्ट को आगंतुकों के ब्राउज़र पर एक सुरक्षित तरीके से चलाने के लिए चाहता हूं, जिस पृष्ठ पर वे सेवा कर रहे हैं उससे अलग है। चूंकि कोड उपयोगकर्ताओं द्वारा सबमिट किया गया है, इसलिए कोई गारंटी नहीं है कि यह भरोसेमंद है।मैं अविश्वसनीय उपयोगकर्ता द्वारा सबमिट की गई जावास्क्रिप्ट सामग्री को सैंडबॉक्स कैसे कर सकता हूं?

अभी मैं तीन विकल्प के बारे में सोच सकते हैं:

  • एक अलग डोमेन से एक iframe में उपयोगकर्ताओं द्वारा प्रदत्त सामग्री की सेवा, और एक ही मूल नीति पर निर्भर हैं। इसके लिए एक अतिरिक्त डोमेन स्थापित करने की आवश्यकता होगी जिसे मैं संभव से बचाना चाहता हूं। मेरा मानना ​​है कि यह कैसे है jsfiddle यह करता है। स्क्रिप्ट अभी भी कुछ नुकसान कर सकती है, उदाहरण के लिए top.location.href बदलना, जो आदर्श से कम है। http://jsfiddle.net/PzkUw/
  • sandbox attribute का उपयोग करें। मुझे संदेह है कि यह ब्राउज़र में अच्छी तरह से समर्थित नहीं है।
  • उन्हें सेवा देने से पहले स्क्रिप्ट को स्वच्छ करें। मैं वहां नहीं जाऊंगा।

क्या ऊपर कोई अन्य समाधान या सिफारिशें हैं?

अद्यतन

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

+2

मुझे लगता है कि आपका उप-डोमेन विचार सर्वोत्तम है। मैंने खुद इस सवाल को देखा है और एक बेहतर समाधान नहीं मिला। मैंने एक बार XmlHttpRequest के माध्यम से स्क्रिप्ट को गतिशील रूप से लोड करने और eval चलाने के साथ खेला - मुझे याद नहीं है कि मैंने इसे क्यों छोड़ा, हालांकि। –

+0

संबंधित: http://stackoverflow.com/questions/958997/frame-buster-buster-buster-code-needed – Petah

+0

मैं @ जेरेमीजेस्टारर से सहमत हूं। भले ही, क्या आपके पास कुछ जेएस तत्वों को नियंत्रित करने का मौका है, ** विंडो ** सबसे महत्वपूर्ण है? यदि ऐसा है, तो मैं इसे आईफ्रेम से किए गए कुछ अनुरोधों को अस्वीकार करने का प्रयास करूंगा लेकिन मुझे यकीन नहीं है कि यह कितना आसान होगा। – inhan

उत्तर

4

आपके अनुप्रयोग में सहायक उपकरण के कुछ विचार उपयोगी हो सकते हैं - वे समस्या को दो अलग-अलग दिशाओं से हमला करते हैं: काजा अविश्वसनीय जावास्क्रिप्ट कोड को सुरक्षित रखने के लिए संकलित करता है जबकि एडसैफ़ जावास्क्रिप्ट का सबसेट परिभाषित करता है जो उपयोग करने के लिए सुरक्षित है।

काजा

Caja

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

AdSafe

AdSafe

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

+0

मैंने एडसेफ में देखा है। यह उन स्क्रिप्ट के लिए डिज़ाइन किया गया है जो फ्रेम में नहीं हैं और इसलिए बहुत ही सीमित हैं। उदाहरण के लिए, आप 'a [i] = 1' नहीं कर सकते हैं। मुझे लगता है कि प्रतिबंध वैध उपयोगकर्ताओं के बहुमत से डर सकते हैं। काजा पर एक नज़र डालेंगे। – Flash

+0

हालांकि आप 'a [+ i] = 1' कर सकते हैं।(ऐसा इसलिए है क्योंकि जब कोई 'ए = विंडो; i =' ev '+' al'' लिखता है तो 'एक [i]' का मतलब 'eval' होगा और यह संभावना स्थिर रूप से समाप्त करना असंभव होगा।) लेकिन आप सही हैं यह आपकी आवश्यकताओं के लिए बहुत ही सीमित हो सकता है। – rsp

26

एक अच्छी तरह से परिभाषित संदेश इंटरफ़ेस बनाएं और उस कोड के लिए जावास्क्रिप्ट वेब वर्कर का उपयोग करें जिसे आप सैंडबॉक्स चाहते हैं। HTML5 Web Workers

वेब श्रमिकों को निम्न DOM ऑब्जेक्ट तक पहुंच नहीं है।

  • विंडो ऑब्जेक्ट

  • दस्तावेज़ वस्तु

  • पैरेंट ऑब्जेक्ट

तो वे अपने पृष्ठ रीडायरेक्ट या उस पर डेटा बदल नहीं सकते।

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

EDIT जॉर्डन ग्रे द्वारा एक जावास्क्रिप्ट लाइब्रेरी प्लगिंग जो टिप्पणी मैंने ऊपर वर्णित किया है, ऐसा लगता है। https://github.com/eligrey/jsandbox

+0

एक अच्छा विकल्प की तरह लगता है लेकिन बहुत ही सीमित हो सकता है। फिर भी विचार के लिए +1। – Christoph

+1

अच्छा सुझाव। मेरी चिंता यह है कि पुराने ब्राउज़र इसका समर्थन नहीं करते हैं। साथ ही, वेब श्रमिक AJAX अनुरोध नहीं कर सकते हैं (जिसका अर्थ है कि मुझे अभी भी एक अलग डोमेन से सेवा करने की आवश्यकता है)? – Flash

+0

@ एंड्रयू - आप किस वेब परिदृश्य को AJAX क्षमताओं के साथ एक वेब कार्यकर्ता देखते हैं? यदि आप अपने डोमेन पर उपयोगकर्ता का प्रतिरूपण करने वाले कार्यकर्ता स्क्रिप्ट के बारे में चिंतित हैं, तो आप केवल कुकी-कम सत्रों का उपयोग कर सकते हैं और उस समस्या से बच सकते हैं। ब्राउजर संगतता के लिए, हाँ, आईई 9 और नीचे एचटीएमएल 5 का समर्थन नहीं करते हैं। –

-4

आप को दूर करने में यह खिड़की, दस्तावेज़ और माता पिता तत्व आप एक बंद, जहां इन स्थानीय खाली चर हैं में यह लपेटकर द्वारा इसे प्राप्त कर सकता है कहने के लिए उपयोग कर सकते है द्वारा कोड के कुछ टुकड़े सैंडबॉक्स में करना चाहते हैं:

(function(window, document, parent /* Whatever you want to remove */){ 
    console.log(this);  // Empty object 
    console.log(window); // undefined 
    console.log(document); // undefined 
    console.log(parent); // undefined 
}).call({}); 

एक खाली वस्तु के साथ यह कॉलिंग महत्वपूर्ण है क्योंकि अन्यथा इसखिड़की वस्तु को इंगित करेंगे

+7

'console.log (function() {इसे वापस करें;}());': पी – Flash

2

जैसा कि बताया गया है, sandboxiframe की विशेषता पहले से ही प्रमुख ब्राउज़रों द्वारा समर्थित है, लेकिन मैं अतिरिक्त रूप से मिश्रित समाधान का सुझाव दूंगा: सैंडबॉक्स किए गए आइफ्रेम के अंदर एक वेब-वर्कर शुरू करने के लिए। यह एक अलग थ्रेड देगा, और अविश्वसनीय कोड से sandboxed iframe के DOM घटना की रक्षा करेगा। इस प्रकार मेरी Jailed लाइब्रेरी काम करता है। इसके अतिरिक्त आप सैंडबॉक्स में फ़ंक्शंस के किसी भी सेट को निर्यात करके किसी भी प्रतिबंध को कामकाज कर सकते हैं।

+0

आपकी लाइब्रेरी के बारे में प्रश्न, आप कोड को सैंडबॉक्स वाले आईफ्रेम और वेब वर्कर में क्यों चलाते हैं? क्या यह सामान्य iframe रखने के लिए पर्याप्त सुरक्षित नहीं होगा, और फिर वेब कार्यकर्ता में अविश्वसनीय कोड चलाएगा? वेब कार्यकर्ता आईफ्रेम के डोम तक नहीं पहुंच सका, या वास्तव में कुछ भी करने के लिए इसे प्राप्त कर सकता है, इसके अलावा आप अपने ऑनमेज कॉलबैक में क्या करते हैं। क्या मैं सही हूँ? – lastmjs

+2

ठीक है, बिल्कुल नहीं। प्रारंभ में यह केवल एक वेब कार्यकर्ता में कोड चला गया, तो मुझे समझाया गया कि यह पर्याप्त नहीं है, क्योंकि एक कर्मचारी के पास अभी भी कुछ स्थानीय मूल उदाहरणों जैसे स्थानीय भंडारण, इंडेक्सडेब इत्यादि तक पहुंच है। इसलिए मुझे एक कर्मचारी को एक में रखना पड़ा sandboxed iframe। एक कार्यकर्ता थ्रेड प्राप्त करने के लिए अभी भी उपयोगी था और पृष्ठ को अनंत लूप के साथ लॉक करना बंद कर देता था। लेकिन बाद में ऐसा लगता है कि कई ब्राउज़र https के तहत आईफ्रेम में चल रहे कार्यकर्ता को प्रतिबंधित करते हैं, इसलिए लाइब्रेरी केवल यदि संभव हो तो एक कार्यकर्ता शुरू करती है, अन्यथा कोड केवल आईफ्रेम में चलता है। – asvd