2012-09-09 9 views
7

मैं इस कोड को एक रिमोटिंग फ़ंक्शन (क्लोजरस्क्रिप्टोन) से कैम करता हूं जहां ब्राउज़र से वापस भेजा गया डेटा पढ़ा जा रहा है। मेरा सवाल यह है कि पढ़ने के लिए eval को स्थापित करने का महत्व क्या है?परिवर्तनीय * read-eval * क्या करता है?

(बाध्यकारी [-पढ़ने के लिए eval झूठी] (पठन-स्ट्रिंग डेटा))

धन्यवाद, मुर्तजा

उत्तर

9

यह एक सुरक्षा उपाय तो ब्राउज़र कोड होने के लिए नहीं भेज सकते हैं सर्वर में निष्पादित उदाहरण के लिए यदि क्लाइंट/ब्राउजर "#=(eval (System/exit 1))" भेजता है और * रीड-इवल * सत्य है, तो सर्वर प्रक्रिया बाहर निकल जाएगी, जो संभवतः ऐसा कुछ है जिसे आप नहीं चाहते हैं।

(binding [*read-eval* false] (read-string "#=(eval (System/exit 1))")) 
(binding [*read-eval* true] (read-string "#=(eval (System/exit 1))")) 

इसके अलावा *read-eval* पर डॉक्स देखें:

व्यवहार का अंतर देखें।

+0

इसे @dAni समझाए जाने के लिए धन्यवाद! यह बहुत उपयोगी था। – murtaza52

+0

'eval' लोगों को भ्रमित करेगा। मुद्दा यह है कि # * के बाद अभिव्यक्ति का मूल्यांकन किया जाता है जब '* read-eval *' सत्य होता है। Eval का उपयोग करने की कोई ज़रूरत नहीं है। – miner49r

4

*read-eval* का मुख्य उद्देश्य पाठक को पढ़ने के समय अभिव्यक्ति का मूल्यांकन करने की अनुमति देना है, आमतौर पर उस चीज़ के लिए जिसमें शाब्दिक नोटेशन नहीं है। यदि *read-eval* सत्य है (डिफ़ॉल्ट), read और read-string निम्न # = अभिव्यक्ति का मूल्यांकन करेगा। आप देख सकते हैं कि *print-dup* सत्य होने के लिए उस सुविधा का उपयोग कैसे किया जाता है - जिसका अर्थ है कि आप मूल्यों को मुद्रित करना चाहते हैं कि उनके सटीक प्रकार संरक्षित हैं, इस स्थिति में आप कुछ मूल्यों को # = नोटेशन के साथ प्रिंट करेंगे। *print-dup* के लिए डिफ़ॉल्ट गलत है - अधिकांश चीज़ों के लिए मानक क्लोजर नोटेशन ठीक है। उदाहरण के लिए, हम आम तौर पर इंटेजर्स और लॉन्ग के बीच भेद की परवाह नहीं करते हैं।

*read-eval* सुविधा कोड लोड करने के लिए उपयोगी है, लेकिन अविश्वसनीय इनपुट के साथ उपयोग किए जाने पर यह सुरक्षा जोखिम पैदा करता है। क्लोजर 1.5 से पहले सामान्य सलाह उपयोगकर्ता इनपुट से निपटने पर *read-eval* झूठ बोलना था। हालांकि, अभी भी जावा ऑब्जेक्ट्स पढ़ने के साथ कुछ समस्याएं थीं जो समस्याएं पैदा कर सकती हैं। यह क्लोजर 1.5 में तय है। सबसे महत्वपूर्ण बात यह है कि क्लोजर 1.5 ने पेश किया, clojure.edn/read और clojure.edn/read-string जो *read-eval* सुविधाओं में से किसी का समर्थन नहीं करता है। वे ईडीएन प्रारूप द्वारा परिभाषित सामान्य क्लोजर मानों का प्रतिनिधित्व करने वाले उपयोगकर्ता इनपुट को पढ़ने के लिए सुरक्षित हैं। अधिक जानकारी के लिए http://edn-format.org देखें।

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