2008-09-03 11 views
28

मैं एक ऐसा पृष्ठ लिखने की कोशिश कर रहा हूं जो PHP को कॉल करता है जो MySQL डेटाबेस में संग्रहीत है। MySQL डेटाबेस में संग्रहीत पृष्ठ में PHP (और HTML) कोड है जो मैं पेज लोड पर चलाना चाहता हूं।मैं एक MySQL डेटाबेस में संग्रहीत PHP को निष्पादित कैसे करूं?

मैं यह करने के बारे में कैसे जा सकता हूं?

+8

इस प्रश्न के लिए धन्यवाद। नीचे दिए गए कई "उत्तरों" के विपरीत, यह एक अच्छा और उपयोगी है। कई LEGIT उपयोग हैं जहां आप PHP आदेशों को डीबी में स्टोर करना चाहते हैं। परिस्थितियों को जानने के बिना "ऐसा मत करो" कहने के लिए सिर्फ घमंडी है। –

उत्तर

30

आप इसके लिए eval कमांड का उपयोग कर सकते हैं। हालांकि मैं इसके खिलाफ अनुशंसा करता हूं, क्योंकि इस दृष्टिकोण का उपयोग करके बहुत सारे नुकसान हैं। डीबगिंग कठिन है (एआर), इसका मतलब है कुछ सुरक्षा जोखिम (डीबी में खराब सामग्री निष्पादित हो जाती है, ओह ओह)।

उदाहरण के लिए When is eval evil in php? देखें। इवल के लिए Google बुरा है, और आपको कई उदाहरण मिलेंगे क्यों आपको एक और समाधान मिलना चाहिए।

अतिरिक्त: शोषण के कुछ संदर्भों के साथ एक और अच्छा लेख this blogpost है। पिछले vBulletin और phpMyAdmin शोषण का जिक्र करता है जो अनुचित Eval उपयोग के कारण थे।

+0

"इवल बुराई" से उद्धरण: "किसी भी उपयोगकर्ता द्वारा आपूर्ति किए गए डेटा को एक eval() कॉल में जाने की अनुमति देना हैक किया जा रहा है।" - ठीक है, अगर मैं डीबी में संग्रहीत अपने कोड का उपयोग करता हूं और उदाहरण के लिए उपयोग करता हूं गतिशील और तेज़ कस्टम फॉर्म पीढ़ी के लिए? – Jeffz

+0

@ जेफज़ आप बेहतर सुनिश्चित करेंगे कि वहां कोई बुरा कोड समाप्त नहीं होगा। इसके अलावा, आप इसे डेटाबेस में क्यों चिपके रहेंगे, न केवल कुछ कोड फ़ाइलों में? –

+0

दोनों तरीके अच्छे हैं, अगर आप जानते हैं कि आप क्या कर रहे हैं; [ए]। फ़ाइल आधारित सुरक्षित है (विशेष रूप से कोडिंग के लिए बिल्कुल नए के लिए), [बी]। डीबी रास्ता अधिक बहुमुखी है, अगर कुछ ऑन-द-फ्लाइट कोड में बदलना आवश्यक है, तो अद्यतन करने से डीबी अपडेट करना आसान है, फ़ाइल की सामग्री को ट्वीव करना (जो कुछ भी) – Jeffz

2

आप PHP में eval फ़ंक्शन देख सकते हैं। यह आपको मनमाने ढंग से PHP कोड चलाने की अनुमति देता है। हालांकि, यह एक बड़ा सुरक्षा जोखिम हो सकता है, और सबसे अच्छा बचा है।

5

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

1

क्या आपने विभिन्न स्रोतों (और उनके बीच भिन्न मॉड्यूल) के लिए विभिन्न कांटे को स्टोर करने के लिए अपने स्रोत नियंत्रण प्रणाली का उपयोग करने पर विचार किया है? यह एप्लीकेशन कॉन्फ़िगरेशन के लिए कई सर्वोत्तम प्रथाओं में से एक होगा जिसे मैं सोच सकता हूं। आपका असामान्य आवश्यकता नहीं है, इसलिए यह एक समस्या है जिसे अतीत में दूसरों द्वारा हल किया गया है; और डेटाबेस में कोड संग्रहीत करना एक ऐसा लगता है कि आपको संदर्भ खोजने में कठिनाई होगी, या सर्वोत्तम अभ्यास के रूप में सलाह दी जा रही है।

अच्छी बात यह है कि आपने स्पष्टीकरण पोस्ट किया है। आपने शायद एक अनजाने में एक उपयुक्त प्रश्न की तलाश में एक जवाब दिया है।

22

आसान:

$x // your variable with the data from the DB 
<?php echo eval("?>".$x."<?") ?> 

, मुझे पता है चलो मेरे लिए काम करता महान कई अनुप्रयोगों में, मदद नहीं कर सकता लेकिन लगता है कि हर किसी को कहने के लिए यह कितना बुरा है जल्दी है, लेकिन धीमी है वास्तव में एक साथ मदद करने के लिए सीधा जवाब ...

+1

मैंने आपके मार्कडाउन को ठीक किया है - यदि आप चार रिक्त स्थान कोड नहीं देते हैं, ' 'को एचटीएमएल टैग के रूप में माना जाता है और – dbr

+1

+1 छुपा हो जाता है यह समाधान व्यावहारिक रूप से काम कर रहा है। केवल eval ($ x) लागू करने से समस्या को हल नहीं किया जा रहा है क्योंकि यह कोड "<" चिह्न पर कोड तोड़ रहा है। तो यह जवाब समस्या हल करता है। गप करने के लिए चीयर्स! – Devner

0

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

$lookFor = $row['page']; 

include("resources/" . $lookFor . "Codebase.php"); 

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

और हां, ऐसे कारण हैं जिन्हें आप संग्रहीत कोड निष्पादित करना चाहते हैं, लेकिन वहां विपक्ष हैं।

+1

आपका बयान कि समावेशन की यह विधि सुरक्षित है भले ही कोई हैकर आपके डीबी तक पहुंच सके, गलत है। यह अभी भी कई शोषणों के लिए कमजोर है, जिनमें से एक "नल बाइट विषाक्तता" या "नल बाइट इंजेक्शन" के रूप में जाना जाता है जो आपकी स्ट्रिंग के अंत को प्रभावी ढंग से हटा सकता है (अनदेखा कर सकता है)। [यहां] देखें (https://websec.wordpress.com/2010/02/22/exploiting-php-file-inclusion-overview/) और [यहां] (http://webcache.googleusercontent.com/search?q = कैश: www.madirish.net/401) अधिक जानकारी के लिए। –

0

डेटाबेस से PHP कोड पढ़ें और अद्वितीय नाम के साथ फ़ाइल में सहेजें और फिर फ़ाइल फ़ाइल को चलाने के लिए यह आसान तरीका है और इसे डीबग करें।

$uniqid="tmp/".date("d-m-Y h-i-s").'_'.$Title."_".uniqid().".php";  
$file = fopen($uniqid,"w"); 
fwrite($file,"<?php \r\n ".$R['Body']); 
fclose($file);       
// eval($R['Body']); 
include $uniqid;