नोट: यह सुपरसियर में भी फिट हो सकता है।sys_get_temp_dir
मैं एक साझा मेजबान पर apache2 mpm itk और open_basedir के साथ PHP 5.3.10 सेट अप कर रहा हूं, कि प्रत्येक उपयोगकर्ता किसी अन्य उपयोगकर्ता की फ़ाइलों को देख या परिवर्तित नहीं कर सकता है। apache2 vhost सेटिंग्स में, मैं उपयोगकर्ता को प्रतिबंधित करने के लिए उपयुक्त प्रविष्टियों जोड़ें:
AssignUserId userA userA
php_admin_value open_basedir /home/userA/www/
php_admin_value upload_tmp_dir /home/userA/www/tmp/
php_admin_value session.save_path /home/userA/www/tmp/
SetEnv TMPDIR /home/userA/www/tmp/
अब, पहली पंक्ति apache2 के लिए उपयोग करने के लिए लिनक्स उपयोगकर्ता, अगले तीन लाइनों basedir, अपलोड निर्देशिका और सत्र savepath परिभाषित सेट उपयोगकर्ता निर्देशिका में होना है। मैं एक सेकंड में अंतिम पंक्ति पर वापस आऊंगा।
अब समस्या के लिए: sys_get_temp_dir()
को PHP के लिए अस्थायी निर्देशिका वापस देनी चाहिए, जो एक लिनक्स सिस्टम पर/tmp डिफ़ॉल्ट है। सुरक्षा कारणों से, यह निर्देशिका उपयोगकर्ता ए के open_basedir में रहनी चाहिए। 5.3.10 के php-स्रोत के अनुसार, sys_get_temp_dir()
समारोह वातावरण चर TMPDIR का उपयोग करता है इस निर्देशिका पाने के लिए:
// php-src/main/php_open_temporary_file.c:217-219
/* On Unix use the (usual) TMPDIR environment variable. */
{
char* s = getenv("TMPDIR");
यह वही विन्यास में पांचवें रेखा से ऊपर क्या करना चाहिए है। हालांकि, sys_get_temp_dir()
पर्यावरण परिवर्तक को अनदेखा कर देता है, जो पूरी तरह से $ _SERVER में सेट है, phpinfo()
के माध्यम से भी देखने योग्य है)।
परिणामस्वरूप sys_get_temp_dir()
पर निर्भर विभिन्न सॉफ़्टवेयर के साथ कुछ गड़बड़ियां होती हैं, क्योंकि यह निर्देशिका open_basedir
सेटिंग से बाहर है। मैंने वैरिएबल को व्यवहार में बदलाव किए बिना सीधे $ _ENV और $ _SERVER में सेट करने का प्रयास किया है। मैंने बिना किसी परिवर्तन के putenv('TMPDIR=/home/userA/www/tmp')
की कोशिश की है।
हालांकि, मैं चर को/etc/apache2/envvars में परिभाषित करके आउटपुट को बदलने में सक्षम हूं - जो मेरे लिए बेकार है, क्योंकि मैं चाहता हूं कि प्रत्येक VHOST का अपना अस्थायी फ़ोल्डर हो।
एकमात्र समाधान मैं अब तक runkit जैसा कोई एक्सटेंशन के माध्यम से आंतरिक sys_get_temp_dir()
अधिलेखन और auto_prepend_file के माध्यम से अपने शामिल किए जाने के लागू कर रहा है मिल गया है। लेकिन वह समाधान इतना गंदा है, मैं बस विश्वास नहीं कर सकता, कि चारों ओर कोई बेहतर समाधान नहीं है।
तो, मेरा प्रश्न: क्या sys_get_temp_dir()
के परिणाम को अपाचे 2 vhost सेटिंग में सेट करने के लिए कोई तरीका है, बिना रनकिट के फ़ंक्शन को पुन: कार्यान्वित किए?
संपादित करें: अपाचे संस्करण 2.2.22 है, और मैं वर्तमान में mod_php का उपयोग करता हूं। चूंकि मुझे मैन्युअल रूप से सभी उपयोगकर्ताओं को जोड़ना होगा, एक एफसीजीआई या इसी तरह का सेटअप भी संभव होगा।
आप किस अपाचे संस्करण का उपयोग कर रहे हैं? 2.0? 2.2? 2.4? – hakre
बस सूचित किया जाए कि 'open_basedir'' वास्तव में महंगा हो सकता है। मैंने परिस्थितियों को देखा है जहां एक जटिल सीएमएस बैकएंड (TYPO3) के पृष्ठ लोड समय open_basedir सुरक्षा के तहत 3 सेकंड से> 50 सेकंड तक बढ़ गए हैं। – Jpsy