Уведомления

Группа в Telegram: @pythonsu

#1 Июль 26, 2011 19:46:05

alexandre
От:
Зарегистрирован: 2010-11-16
Сообщения: 104
Репутация: +  0  -
Профиль   Отправить e-mail  

песочница, exec() и __builtin__.__import__

Вообщем была попытка сделать песочницу на питоне с помощью exec() естесно запретив лишние импорты, для простых вещей типа 2+2 она работает отлично. Но вот понадобилось получить из базы что нить то есть все таки добавить хитрым образом нужный импорт и тут затык.

import __builtin__
i = __builtin__.__import__
def importer(a, s, d, f=[], g=-1):
aaa = {"json":True, "simplejson":True, "decoder":True}
print a
if a in aaa:
return i(a, s, d, f, g)
return None

clean_db = None
def get_doc(doc_id):
doc = clean_db[doc_id]
return doc['head_field']

def ttt():
clean_db = couch['db']
try:
param = {"get_doc":get_doc}
#запрещаем импорт
__builtin__.__import__ = importer
exec("""get_doc("4b24907ade8de755b66b1474ff0034d7")""", param)
#разрешаем импорт
__builtin__.__import__ = i
except Exception, e:
print "ошибка песочницы %s, строка %s" % (e, traceback.format_exception(*sys.exc_info())[1])
ttt()
Выдает ошибку
ошибка песочницы 'NoneType' object is unsubscriptable, in ttt
exec("""get_doc("4b24907ade8de755b66b1474ff0034d7")""", param)
если функцию ttt закоментировать например а просто написать
clean_db = couch['py']
__builtin__.__import__ = importer
param = {"get_doc":get_doc}
exec("""get_doc("4b24907ade8de755b66b1474ff0034d7")""", param)
То все нормально. В чем разница не совсем понятно?



Офлайн

#2 Июль 27, 2011 14:03:27

alexandre
От:
Зарегистрирован: 2010-11-16
Сообщения: 104
Репутация: +  0  -
Профиль   Отправить e-mail  

песочница, exec() и __builtin__.__import__

Все решилось с помощью клаcсов. Была не совсем понятная проблема с областью видимости.



Офлайн

#3 Июль 28, 2011 09:37:54

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

песочница, exec() и __builtin__.__import__

Изменять __builtin__.__import__ лучше с помощью try..finally блока, т.к. в случае любой ошибки оригинальный импорт обязательно должен быть восстановлен. О многопоточности видимо можно забыть.



Офлайн

#4 Июль 28, 2011 19:34:09

alexandre
От:
Зарегистрирован: 2010-11-16
Сообщения: 104
Репутация: +  0  -
Профиль   Отправить e-mail  

песочница, exec() и __builtin__.__import__

Спасибо восстановление в пример не вошло просто. Ну многопоточность да но в данном случае главное изолированность песочницы. Тут другая проблема всплыла обнаружилось что в питоне нет как таковой приватности:). Тоесть если поставить два подчеркивания перед атрибутом класса то он какбы приватный но если перед ним написать его класс с подчеркиванием то он становиться не приватным что с этим делать совсем не понятно все что пришло в голову это динамическое переименование класса, но этож извращение реализовывать приватность класса вместо языка.



Отредактировано (Июль 28, 2011 19:36:04)

Офлайн

#5 Июль 28, 2011 19:49:28

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

песочница, exec() и __builtin__.__import__

Нет в Питоне приватности. И надёжной песочницы тоже нет. Считается, что это не нужно.
Если требуется надёжная песочница — её следует выполнять в отдельном процессе в сильно обрезанной сборке Питона.



Офлайн

#6 Июль 28, 2011 19:58:27

alexandre
От:
Зарегистрирован: 2010-11-16
Сообщения: 104
Репутация: +  0  -
Профиль   Отправить e-mail  

песочница, exec() и __builtin__.__import__

Может попробовать javascript прикрутить к питону и в нем организовать песочницу? Если это нормально возможно?



Офлайн

#7 Июль 28, 2011 21:02:24

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

песочница, exec() и __builtin__.__import__

http://code.google.com/p/pyv8/ если хотите



Офлайн

#8 Июль 28, 2011 21:45:46

alexandre
От:
Зарегистрирован: 2010-11-16
Сообщения: 104
Репутация: +  0  -
Профиль   Отправить e-mail  

песочница, exec() и __builtin__.__import__

Надо попробовать выглядит классно. Интересно есть положительный опыт использования подобного для песочницы:)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version