2011-05-30 7 views
6

मैं LuaInterface 2.0.3 का उपयोग कर अपने सी # एप में कुछ लुआ स्क्रिप्टिंग कार्यक्षमता को एम्बेड करने की कोशिश कर रहा हूं। यह अभी तक ठीक काम कर रहा है, लेकिन मैं यह नहीं समझ सकता कि केवल कुछ निर्दिष्ट .NET कक्षाओं तक पहुंच प्रतिबंधित कैसे करें। डिफ़ॉल्ट रूप से, सभी .Net पुस्तकालय सीधे "लुआनेट" के माध्यम से पहुंच योग्य होते हैं और लुआ स्क्रिप्ट नई विंडो खोलने या फ़ाइल सिस्टम तक पहुंचने के लिए स्वतंत्र होते हैं।लुआइंटरफेस - नेट क्लास तक पहुंच प्रतिबंधित कैसे करें?

उदा। इस लुआ स्क्रिप्ट एक नई विंडो खुलेगी:

Form = luanet.System.Windows.Forms.Form 
    mainForm = Form() 
    mainForm:ShowDialog() 

पटकथा की स्वतंत्रता महान और सभी है, लेकिन इस की मेजबानी एप्लिकेशन के साथ हस्तक्षेप करने की संभावना है और कुछ सुरक्षा संबंधी निहितार्थ मैं की भी शौकीन नहीं हूँ है। क्या इसे अक्षम करने का कोई तरीका है?

+0

यह संभव है कि इसे गेम डेवलपमेंट, http://gamedev.stackexchange.com/ पर बेहतर प्रतिक्रिया मिलेगी। यह ऐसा कुछ है जो खेल देवों को अतीत में करने की अधिक संभावना है, और वैसे भी खेल विकास के बारे में प्रतीत होता है। – Glenn

+1

लुआ सैंडबॉक्सिंग पर एक कम विशिष्ट प्रश्न, जो आपको सही दिशा में इंगित कर सकता है, यहां है: http://stackoverflow.com/questions/1224708/how-can-i-create-a-secure-lua-sandbox – BMitch

उत्तर

9
--make a table for all the classes you want to expose 
safeClasses = {} 
--store all the ones you want 
safeClasses.Form = luanet.System.Windows.Forms.Form 
--etc... 

--remove access to LuaInterface 
luanet = nil 
package.loaded.luanet = nil 
--prevent future packages from being loaded 
require = nil 
package.loadlib = nil 

तुम भी रिवर्स में ऐसा कर सकता है, पहले LuaInterface के वैश्विक और संग्रहीत उदाहरणों को दूर करने के लिए और फिर एक स्थानीय संदर्भ के माध्यम से सभी काम कर रही है (जो block के बाकी हिस्सों में सभी कोड का उपयोग कर सकते हैं):

--get a local reference to LuaInterface without clobbering the name 
local luainterface = luanet 

--delete the global reference to it 
luanet = nil 

--also delete it from the package store and disable package loading 
package.loaded.luanet = nil 
require = nil 
package.loadlib = nil 

--put luanet back locally at its original name (for convenience) 
local luanet = luainterface 

--make a table for all the classes you want to expose 
safeClasses = {} 
--store all the ones you want 
safeClasses.Form = luanet.System.Windows.Forms.Form 
--etc... 

(आप उपरोक्त (local luainterface=luanet; luanet=nil; local luanet=luainterface तीन चरणों नाम-संरक्षण नृत्य) वैश्विक मेज पर _G संदर्भ के माध्यम से luanet के लिए सीधे स्थानीयकृत और उसके बाद वैश्विक हटा कर से बचने कर सकते हैं:

local luanet=_G.luanet 
_G.luanet = nil 

मैंने अभी व्यक्तिगत वरीयता के मामले के रूप में नहीं चुना है।)

+0

केवल इसे तुरंत देखा, लेकिन यह पहले से ही उत्कृष्ट दिखता है। मुझे लगता है, मेरी गलती यह माननी थी कि इसे किसी भी तरह से लूआ दुभाषिया को अलग-अलग स्थापित या कॉन्फ़िगर करके सी # में किया जाना चाहिए - यह नहीं पता था कि सैंडबॉक्सिंग सीधे लुआ में किया जा सकता है। – Mario

+0

ने मेरे ऐप में इसका परीक्षण किया - यह ** बिल्कुल ** ** जो मैं ढूंढ रहा था। इस [लिंक] के साथ संयुक्त (http://lua-users.org/wiki/SandBoxes) आलेख अब मुझे अपने लुआ स्क्रिप्ट के लिए उचित सैंडबॉक्स बनाने में सक्षम होना चाहिए। धन्यवाद! :) – Mario

0

मुझे सच में यकीन नहीं है कि आप इसके बारे में वास्तव में कैसे जाएंगे, लेकिन पहला कदम इसे अतिरिक्त AppDomain में होस्ट करना चाहिए। उस अतिरिक्त ऐपडोमेन के साथ, आपके पास मॉड्यूल का उपयोग किया जा सकता है और कौन सा नहीं हो सकता है, हालांकि, यह आपके मुख्य कार्यक्रम और स्क्रिप्ट के बीच डेटा को स्थानांतरित करने के लिए अतिरिक्त कार्य जोड़ देगा।

AssemblyLoad/AssemblyResolve घटनाएं आपका पहला स्टॉप होना चाहिए।

+0

I ऐसा नहीं लगता कि यह "अतिरिक्त काम" के कारण बिल्कुल पर्याप्त प्रदर्शन करेगा। लुआ को खेल तर्क जैसे एआई या मिशन स्क्रिप्ट्स ड्राइव करना है ... सुनिश्चित नहीं है कि उस कार्य के लिए क्रॉस-एपडोमेन संचार होगा, लेकिन मुझे इसके साथ थोड़ा सा अनुभव नहीं है, इसलिए ... हाँ। :/ – Mario

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