2015-10-13 11 views
5

मैं react-metaform पर काम कर रहा हूं, और मेरी चुनौतियों में से एक यह है कि मुझे अंत उपयोगकर्ता को मेटाडेटा को कार्यों के रूप में परिभाषित करने की अनुमति देने की आवश्यकता है। उदाहरण:मैं कैसे जांच सकता हूं कि कोई फ़ंक्शन एक शुद्ध कार्य है या नहीं?

socialSecurityNumber.required: (m) => m.type == 'person' 

समस्या स्पष्ट है: मैं उपयोगकर्ता भरोसा नहीं कर सकते। शुद्ध समारोह होना चाहिए

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

सवाल यह है: मुझे यकीन है कि एक उपयोगकर्ता परिभाषित समारोह केवल पहुँचता यह मानकों और कुछ नहीं है कैसे कर सकता हूँ?

+3

मैं आपका सर्वश्रेष्ठ दांव ग्रहण करेंगे है अपनी खुद की अभिव्यक्ति भाषा कि पार्स किया गया है परिभाषित करने के लिए और फिर 'नया फ़ंक्शन' का उपयोग करने के बजाय, आपकी वास्तविक वस्तुओं पर मूल्यांकन किया गया। – Bergi

+2

http://stackoverflow.com/questions/14889393/how-to-run-a-javascript-function-in-a-andbox-environment – epascarello

+2

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

उत्तर

1

मैं फ़ाइलों या डेटाबेस में संग्रहीत उपयोगकर्ताओं के जावास्क्रिप्ट कार्यों को पार्स करने के लिए esprima का उपयोग करूंगा। और मैं केवल कोड चलाने की अनुमति दूंगा जो पार्सिंग टेस्ट पास करता है (केवल श्वेतसूची वाली विशेषताएं - स्थानीय चर, पैरामीटर, ... का उपयोग कर)।

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


नोट: Angular.js अपनी निर्भरता इंजेक्शन के लिए 'चाल' इस तरह का उपयोग करता है: https://jsfiddle.net/987Lwezy/

function test() { 
    console.log("This is my secret!"); 
} 


function parser(f) { 
    document.body.innerHTML = test.toString(); 
} 

parser(test); 
+0

एचएम, यह कैसे 'फ़ंक्शन() {[] .__ proto __। स्लाइस = फ़ंक्शन() {वापसी "मैंने आपको ऐप खराब कर दिया है!'; }; } '(जो कोई मुफ्त चर का उपयोग नहीं करता है)? – Bergi

+0

ओपी ने कहा कि वह केवल उपयोगकर्ता पैरामीटर तक पहुंचने की अनुमति देना चाहता है। '[] .__ proto __। टुकड़ा 'के लिए असाइनमेंट उपयोगकर्ता पैरामीटर के लिए असाइनमेंट नहीं है। –

+0

अनिवार्य रूप से, आपको या तो जावास्क्रिप्ट के एक उप-समूह के साथ आना होगा जिसे आप अनुमति देते हैं या कोई अन्य समाधान चुनते हैं। "श्वेतसूची समाधान" का उपयोग करना और "ब्लैकलिस्ट समाधान" का उपयोग करना बिल्कुल महत्वपूर्ण है। मेरा मतलब है कि आप केवल 'eval' को मना नहीं कर सकते हैं और सर्वश्रेष्ठ के लिए आशा करते हैं। आप फ़ंक्शन पैरामीटर के साथ केवल मूल अंकगणित सक्षम कर सकते हैं ... क्योंकि मुझे पता है कि यह कुछ परिदृश्यों में पर्याप्त हो सकता है। –

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

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