使用用户提供的脚本parsing文本文件的安全方法

我正在寻找一种方法来parsing用户提供的URL的文本,用户也提供了parsing器脚本。 eval很容易,但显然超级可怕。 最终目标是只允许用户指向我的服务器的数据源,并告诉我的服务器如何读取数据。

什么是最安全的方法来做到这一点? python或节点首选,但我不限于任何特定的语言。

所以例如。 这是一个cvs文件,但有时我只会有一个文本文件。 url: http : //www.ams.usda.gov/mnreports/lm_xb803.txt

这个python脚本可以从url读取文件,并存储在数据库中:

expected_length = 6 requiredFeilds = ['low','high'] requiredNonZero = ['low','high'] response = urllib2.urlopen(url) reader = csv.reader(response) grade = None date = None first_row = True keep_list = [] for row in reader: if len(row) != expected_length: continue if first_row: date_text = row[2] date_object = datetime.strptime(date_text, '%m/%d/%Y') date = date_object.strftime("%Y-%m-%d") first_row = False row_label = row[0].strip() row_label = re.sub('\s\s+',' ',row_label) grade_labels = { 'Select Cuts':'sl', 'Choice Cuts':'ch', 'Choice and Select Cuts':'slch', 'Ground Beef':'grnd', 'Beef Trimmings':'trim' } if row_label in grade_labels.keys(): grade = grade_labels[row_label] continue row.insert(0,grade) row.append(date) # ignore until grade is selected if row[0] is None: continue # check rqs try: for field in requiredFeilds: if len(row[ormMap[field]]) == 0: raise Exception('required field missing') except: continue try: for field in requiredNonZero: if row[ormMap[field]] < 1: raise Exception('required field missing') except: continue keep_list.append(row) 

我不知道任何足够强大的语言,可以“安全沙箱”,以确保一个熟练的,恶意的用户不能用他或她提供的脚本(程序)运行损害 – 而不是没有操作系统的支持,那是。

幸运的是,操作系统的支持可行的 – 在这一点上,脚本/程序写入的语言几乎没有关系。

如果启动虚拟机,并在有限的资源和密切的监督下运行用户提供的程序,可以使事情变得非常安全。

如果你愿意为了减less开销而牺牲一些安全的保证,你可以在BSD监狱运行用户程序 – BSD监狱已经存在了很长时间,并且已经非常成熟并且经validation明是可靠的。

Linux容器提供了一个非常相似的方法,并承诺,但只是没有在任何地方这么长时间,所以,有些人可能会认为他们更危险。

Chrome浏览器的便携式本机客户端 https://developer.chrome.com/native-client ,可以在Chrome浏览器内的大概安全的沙箱中运行用户程序(适当地编译为机器代码)。

我相信还有其他的解决scheme,有类似的整体方法,在虚拟机的某个地方 – >监狱/容器 – > NaCl频谱,或者只是在它之外。 根据你能负担多less开销,我尽可能的接近这个频谱的“左”(VM)端 – 而不是依赖任何一个特定语言的“所谓的沙箱”运行时间…但也许我只是一个悲观主义者! – )

Interesting Posts