PHP के लिए सैंडबॉक्स

हमारी एक परियोजना में, सेवा की कार्यक्षमता का विस्तार करने के लिए प्लगइन्स लिखना संभव है।
उपयोगकर्ता हमारे इंटरफ़ेस में एप्लिकेशन प्लग इन बनाते हैं और PHP में उनके तर्क का वर्णन करते हैं।
यह PHP की संभावनाओं को सीमित करने के लिए आवश्यक था, ताकि कोई भी गलती से हमें कोडित न करे।
एक संरक्षित वातावरण में PHP कोड निष्पादित करने के लिए कई उपकरण हैं: एक अलग प्रक्रिया में निष्पादन, एक फ़ाइल में कोड को सहेजना और क्लिंटेड क्षमताओं के साथ cli के माध्यम से कॉल करना या PHP के लिए विशेष एक्सटेंशन का उपयोग करना।
सेवा और अनुप्रयोगों की बारीकियों के कारण, साथ ही सभी ऑपरेटिंग सिस्टम पर सैंडबॉक्स का उपयोग करने की संभावना (सैंडबॉक्स के लिए प्रक्रियाएं और एक्सटेंशन विंडोज पर काम नहीं करते हैं), एक छोटा वर्ग बुनियादी PHP सेटिंग्स के साथ लिखा गया था: Ext_Sandbox -PHPValidator

कक्षा का एक छोटा विवरण

अंदर केवल दो कार्य हैं:

php_syntax_error

फ़ंक्शन चेक करता है कि क्या PHP कोड का सिंटैक्स सही है (क्या ब्रैकेट गायब हैं, आदि)।
$ कोड - php कोड (बिना <php)
$ टोकन एक वैकल्पिक पैरामीटर है, आप इसे पास कर सकते हैं यदि आपने पहले से ही कोड को टोकन में डाल दिया है (आप token_get_all फ़ंक्शन का उपयोग करके पार्स कर सकते हैं)।
फ़ंक्शन स्वरूप में एक त्रुटि देता है: सरणी (त्रुटि संदेश, त्रुटि लाइन #)
यदि कोई त्रुटि नहीं है, तो फ़ंक्शन गलत वापस आ जाएगा।

validatePHPCode

फ़ंक्शन php कोड की जांच करता है और चेक (सच्चा या गलत) का परिणाम देता है।
$ स्रोत - php कोड बिना <? php शुरुआत में
$ कार्य - अनुमत / निषिद्ध कार्य
$ सक्षम - बूलियन, यदि सच है, तो $ कार्यों में अनुमत कार्यों की एक सूची होगी, यदि गलत है - निषिद्ध कार्यों की सूची।

एक उदाहरण:

<?php require 'PHPValidator.php'; $code = <<<PHP \$b = 1; \$c = 2; \$a = \$b + \$c; echo \$a; class test { public function __construct() { echo 'construct'; } public function foo(\$num) { var_dump(\$num); } } \$test = new test(); \$test->foo(\$a); PHP; // validate the code $validator = new Ext_Sandbox_PHPValidator(); try { // we enable only one function - echo, all others will throw error $validator->validatePHPCode( $code, array('echo'), true); $status = 'passed'; } catch(Exception $ex) { $status = $ex->getMessage(); } echo 'Status of validation is: ' . $status; 


इसे ऑनलाइन आज़माएं: http://ideone.com/e1qx28

वर्ग GitHub पर है।

Source: https://habr.com/ru/post/In179645/


All Articles