2012-03-30 9 views
6

मैं ब्राउज़र एप्लिकेशन के लिए एक सिस्टम लिख रहा हूं जो डेटाबेस में कुछ विशेष PHP स्क्रिप्ट को संग्रहीत करेगा और फिर उन्हें बाहर खींचकर आवश्यकतानुसार निष्पादित करेगा। सबसे पहले मैंने निष्पादन() और पाइपिंग को एक स्क्रिप्ट के आउटपुट का उपयोग करने का प्रयास किया जिसने स्क्रिप्ट को डेटाबेस से बाहर निकाला और उन्हें मुद्रित किया। यह एक प्रयोग के मामले में काम करता था, लेकिन सभी नहीं, और भंगुर महसूस करता है, इसलिए मैं एक बेहतर तरीका ढूंढ रहा हूं।"php: // memory" स्ट्रीम से शामिल है

अब मैं स्मृति में एक PHP फ़ाइल स्ट्रीम के उपयोग के माध्यम से इसे पूरा करने का प्रयास कर रहा हूं। उदाहरण के लिए:

$thing = <<<'TEST' 
<?php 

$thing = array(); 

print "Testing code in here."; 
var_dump($thing); 

?> 
TEST; 

$filename = "php://memory"; 

$fp = fopen($filename, "w+b"); 
fwrite($fp, $thing); 
//rewind($fp); 

fclose($fp); 

include "php://memory"; 

हालांकि, स्क्रिप्ट निष्पादित होने पर कुछ भी मुद्रित नहीं किया जाता है। क्या यह इस माध्यम से भी संभव है, और यदि नहीं, तो ऐसा करने का कोई और तरीका है? मैं अस्थायी फ़ाइलों को लिखने और उनसे पढ़ने से बचने की कोशिश कर रहा हूं, क्योंकि मुझे यकीन है कि फाइल सिस्टम तक पहुंचने से चीजों को धीमा कर दिया जाएगा। क्या कोई ऐसा URL है जिसे मैं "शामिल" करने के लिए प्रदान कर सकता हूं ताकि यह स्मृति स्ट्रीम को पढ़ सके जैसे कि यह एक फ़ाइल थी?

मुझे नहीं लगता कि eval() ऐसा करेगा, जैसा कि मुझे सही याद है, यह एक पंक्ति तक ही सीमित है।

इसके अलावा, कृपया "eval = include = hell" उत्तर नहीं दें। गैर-व्यवस्थापक उपयोगकर्ताओं को डेटाबेस में संग्रहीत स्क्रिप्ट लिखने की पहुंच नहीं है, मुझे पता है कि इसे मेरे आवेदन के जीवन चक्र पर विशेष उपचार की आवश्यकता है।

+0

मेरे शब्द, मैं पूरी तरह से गलत था। Eval एक से अधिक लाइन के लिए काम करता है। मैंने इसे भी कोशिश नहीं की ... मान लीजिए कि तब काम करेगा। हालांकि, मैं अभी भी स्मृति में संग्रहीत फ़ाइल धाराओं के बारे में उत्सुक हूं, इसलिए यदि किसी के पास उस हिस्से का उत्तर है, तो मैं आभारी रहूंगा। –

+0

क्या कोई विशेष कारण है कि आप फाइलें बनाना नहीं चाहते हैं? फाइल सिस्टम फाइलों के लिए एक डेटाबेस है। और: ओएमजी ऐसा मत करो जो खतरनाक है। इससे कोई फर्क नहीं पड़ता कि केवल व्यवस्थापक इन php फ़ाइलों को लिख सकते हैं, जैसे ही आपके पास SQL ​​इंजेक्शन बग है या कोई आपके MySQL प्रमाण-पत्र -> insta-remote-code-execution को प्राप्त/अनुमान/प्रकट करने का प्रबंधन करता है। – mensi

उत्तर

5

php://memory stream से पढ़ने के लिए आपको stream_get_contents का उपयोग करने की आवश्यकता है। आप इसे सीधे शामिल नहीं कर सकते हैं।

4

eval() और include वास्तव में वही हैं। तो eval() एकाधिक लाइनों के साथ काम करता है - बस FYI। हालांकि, मैं यहां include पसंद करूंगा, मुझे हमेशा लगता है कि यह तेज़ है। शायद मैं गलत हूँ, कोई विचार नहीं।

हालांकि, मुझे लगता है कि आपको अपना कोड डीबग करना चाहिए, मुझे कोई कारण नहीं दिख रहा है कि इसे क्यों काम नहीं करना चाहिए। आपको rewind पॉइंटर (आपने उस पर टिप्पणी की है) की आवश्यकता हो सकती है, लेकिन आपको पहले हाथ की जांच करनी चाहिए, that your PHP configuration allows to include URLs। मुझे पता है कि यह सेटिंग data:// यूआरआई के उपयोग से रोकती है, इसलिए हो सकता है कि आप इसे सक्षम कर सकें।

इसके अलावा आप हमेशा कोशिश कर सकते हैं कि PHP file_get_contents का उपयोग कर स्मृति को खोल सकता है और बाहर निकल सकता है। यह आपको कोड देना चाहिए। यदि नहीं, तो आप पहले ही कुछ गलती कर चुके हैं (उदा। कोई रिवाइंड या कुछ समान नहीं)।

संपादित करें: मुझे लगता है कि अब तक (demo) नहीं आए हैं:

<?php 
/** 
* Include from “php://memory” stream 
* @link https://stackoverflow.com/q/9944867/367456 
*/ 

$thing = <<<TEST 
<?php 
\$thing = array(); 
print "Testing code in here."; 
var_dump(\$thing); 
TEST; 

$filename = "php://memory"; 

$fp = fopen($filename, "w+b"); 
fwrite($fp, $thing); 
rewind($fp); 

var_dump(stream_get_contents($fp)); 

यह मैं क्या पता चला है:

  1. आप "फाइल" बंद नहीं करना चाहिए। php://memory एक स्ट्रीम बंद हो जाने पर यह गायब हो जाएगा।
  2. आपको $fp को स्ट्रीम के रूप में एक्सेस करने की आवश्यकता है, जो AFAIK बॉक्स के बाहर include के लिए संभव नहीं है।
  3. आपको फिर एक स्ट्रीम रैपर बनाने की आवश्यकता होगी जो एक फ़ाइल नाम पर स्ट्रीम संसाधन को मानचित्र करे।
  4. जब आपने ऐसा किया है, तो आप एक मेमोरी स्ट्रीम शामिल कर सकते हैं।
  5. PHP सेटिंग्स जिन्हें आपको वैसे भी जांचने की आवश्यकता है। एक से अधिक हैं, PHP मैनुअल से परामर्श लें।

यह डेटा यूआरआई (demo) का उपयोग करने के लिए आसान हो सकता है:

<?php 
/** 
* Include from “php://memory” stream 
* @link https://stackoverflow.com/q/9944867/367456 
*/ 

$thing = <<<TEST 
<?php 
\$thing = array(); 
print "Testing code in here."; 
var_dump(\$thing); 
TEST; 

include 'data://text/plain;,'. urlencode($thing); 

रूप में अच्छी तरह देखें: Include code from a PHP stream

+0

यह एक अपरिभाषित चर त्रुटि देता है। इसे ठीक करने के लिए, 'var_dump ($ चीज़) बदलें; '' var_dump (\ $ चीज़); ' –

+0

@ क्लाउडियो सिल्वा: फिक्स्ड। संकेत के लिए Thx। – hakre

0

अगर वहाँ एक तरह से php से शामिल करने के लिए है: // स्मृति तो यह एक गंभीर भेद्यता है। हालांकि इसमें कई उपयोग हैं, दुर्भावनापूर्ण कोड को छिपाने के लिए कोड obfuscation तकनीकों के साथ अक्सर eval का उपयोग किया जाता है।

(हर उपकरण एक हथियार अगर आप इसे सही पकड़ है।)

ने कहा, (शुक्र) किसी भी स्पष्ट तरीका हो प्रतीत नहीं होता है php से शामिल करने के लिए इसी के साथ

: // स्मृति

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