2011-03-31 12 views
5

मैं एक Wordpress प्लगइन के कोड के माध्यम से जा रहे हैं और निम्नलिखित पाया:जब (यदि कभी) आप PHP में ऐसा करेंगे?

eval('?>' . $foo . '<?php ');

मैं उत्सुक हूँ अगर वहाँ कुछ विशिष्ट स्थिति मुझे लगता है कि के बारे में पता कर रहा हूँ है यह सही तरीका होगा $foo चर का उत्पादन करने के लिए। क्या यह सिर्फ प्लगइन लेखक का निराशाजनक मामला है या क्या मुझे कुछ पता होना चाहिए? मैं सिर्फ echo का इस्तेमाल किया है कि ...

अद्यतन:

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

+4

कि सिर्फ horroristic है। – vbence

+0

कोड की वह पंक्ति मुझे दुःस्वप्न देने जा रही है ओ.ओ –

उत्तर

6

इस उदाहरण में, $foo एक स्ट्रिंग है (संभवतः) में लाइन वाले PHP कोड हो सकते हैं। इस प्रकार, इस PHP कोड को निष्पादित करने के लिए, स्ट्रिंग को eval 'ed होना चाहिए।

कहा कि, eval के उपयोग आम तौर पर, पर सिकोड़ी है अलग परिस्थितियों की एक बहुत संकीर्ण सेट में से के रूप में यह दुर्भावनापूर्ण कोड के निष्पादन के लिए नेतृत्व कर सकते हैं। (अर्थात .: अगर कोई संभावना है कि $foo एक उपयोगकर्ता द्वारा प्रदान की स्ट्रिंग है, तो eval का उपयोग करें विनाशकारी परिणाम हो सकता है।)

अधिक जानकारी के लिए मौजूदा When is eval evil in php? प्रश्न/उत्तर देखें।

+0

लेकिन यह PHP कोड नहीं होगा, है ना? क्योंकि आप उन करीबी और खुले टैगों को भी 'eval' कर रहे हैं। '$ foo' में HTML या कुछ होना होगा, है ना? (लेकिन एक स्ट्रिंग में, जाहिर है।) – sdleihssirhc

+0

@ एसडीलेहिसिर एचसी: बिंगो। इसका उपयोग अक्सर टेम्पलेट कोड को निष्पादित करने के लिए किया जाता है जो अधिकतर PHP या PHP है जिसे काम करने के लिए स्ट्रिंग-स्तरीय हेरफेर की कुछ किस्मों की आवश्यकता होती है। – Charles

+0

@sdleihssirhc प्रारंभ और अंत टैग जोड़ना आवश्यक है जब तक स्ट्रिंग * बस * PHP कोड नहीं है, एक स्ट्रिंग के विपरीत जो एम्बेडेड PHP टैग शामिल है। –

2

वह चर का उत्पादन नहीं कर रहा है। $foo में सबसे अधिक संभावना है एक टेम्पलेट, अन्य <?=$code();?> स्निपेट के साथ।

समापन और खोलने वाले PHP मार्कर का उपयोग इन eval में इनलाइन कोड से स्विच करने के लिए, HTML मोड पर स्विच करने के लिए किया जाता है। कम या ज्यादा मात्रा में करने के लिए इस eval():

include("data:,$foo"); // treat $foo string as if it was include script 
+0

ऐसा होता है कि 'शामिल' विधि को 'allow_url_include' सक्षम होना आवश्यक है, जबकि eval विधि नहीं है। निराशाजनक ... – Charles

+0

हाँ। अन्य कामकाज इसे एक अस्थायी फ़ाइल में सहेजना होगा। (लेकिन मैं * उस * पर भी विचार करता हूं - इससे भी बदतर।) – mario

+0

यह दिमाग-पिघलने वाला होगा। लगता है कि कैसे Smarty काम करता है! – Charles

-1

मुझे इसे फिर से दोहरा दें: c.r.a.p

तो eval() जवाब है, आप लगभग निश्चित रूप से गलत सवाल पूछ रहे हैं।

रस्मुस लेर्दोर्फ़

+1

-1 और आपका "उत्तर" ओपी की मदद कैसे करता है? –

+0

एफवाईआई, ध्यान दें कि मैं यह नहीं कर रहा हूं। मैंने इसे एक प्लगइन में पाया। – Endophage

+0

चलो, मुझे अपने उपयोगकर्ता नाम के तहत 2112 पसंद आया। प्लगइन लेखक निराला है, और एंडोफेज बस 'echo' का उपयोग करें। @ एन्डोफेज, आपने कभी नहीं कहा था, और आपको नहीं करना चाहिए। –

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