2010-04-03 11 views
8

मुझे एहसास है कि यह थोड़ा पागल लगता है, लेकिन मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं जिसके लिए मुझे उपयोगकर्ता द्वारा प्रदत्त रूबी कोड चलाने और परिणाम वापस करने के लिए सर्वर की आवश्यकता है।उपयोगकर्ताओं को मनमाने ढंग से रूबी कोड चलाने के लिए कैसे सुरक्षित रखें?

मैं कुछ इस तरह रोकने के लिए देख रहा हूँ:

system("rm -rf /") 
eval("something_evil") 
# etc... 

मुझे यकीन है, यह करने के लिए कुछ हद सुरक्षित तरीका होना चाहिए के रूप में यह पहले से ही tryruby.org जैसी जगहों पर मौजूद है। किसी भी मदद की बहुत सराहना की है, धन्यवाद!

उत्तर

6

तीन सुझाव:

1) रूबी taint levels पर एक नजर डालें। यह (कर सकते हैं आदि

2) के खिलाफ, eval('evil_code') प्रकार चीजों की सुरक्षा के कुछ डिग्री, जब तक उपयोगकर्ता वास्तव में, स्थानीय फाइल सिस्टम के लिए उपयोग की जरूरत है fakefs

3 की तरह कुछ का उपयोग करें) कोई बात नहीं और क्या आप follow Tronic's suggestion करना प्रदान करता है सेटअप करने के लिए दर्द हो, लेकिन सीमित क्रोट जेल पूरी तरह से सुनिश्चित करने का एकमात्र तरीका है कि उपयोगकर्ता उन संसाधनों तक नहीं पहुंच सकता है जिन्हें आप स्पष्ट रूप से नहीं चाहते हैं)।

3

कम से कम क्रोट में संसाधन सीमा (मेमोरी उपयोग इत्यादि) के साथ, उपयोगकर्ता/समूह के रूप में किसी भी उपयोगकर्ता के रूप में अनुमत syscalls के श्वेतसूची के साथ प्रोग्राम को चलाएं।

2

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

This answer shows how to do it

0

मुझे एक ही समस्या थी लेकिन फिर eval.so पर आई और इसके लिए एक एपीआई रैपर लिखने का फैसला किया, जिसे Sandie कहा जाता है।

sandie = Sandie.new(language: 'ruby') 
# => #<Sandie:0x00000002e30650> 
sandie.evaluate(code: 'puts "hello world"') 
# => {"stdout"=>"hello world\n", "stderr"=>"", "wallTime"=>487, "exitCode"=>0} 

यह भी अन्य भाषाओं की एक पूरी बहुत कुछ के रूप में अच्छी तरह सी #, पर्ल, लुआ, और जावा का समर्थन करता है: यह जितना आसान है।

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