Как стать автором
Обновить

Комментарии 9

ACL для доступа к объектам не решение? Или в мире WEB/LINUX принято давать доступ ко всему подряд без проверки, кто куда хочет???
Зачем ВООБЩЕ ПАРСИТЬ на плохой код в запросе??? Искренне не понял проблемы, подскажите, please.
Судя по тому, что я тоже не понял суть возражения, видимо я не совсем четко в статье это прописал. Область применения — везде, где «по фичам» подходит eval(), но «по безопасности» он не подходит. Часть возможных примеров приведены в статье (хоть и использовать питон для фильтрации трафика — слишком медленно, тем не менее) — в файрволе, в почтовой программе, в бухгалтерской, в любом веб-приложении с базой данных, даже в СУБД. В том числе — и для определения админом правил доступа (для всех из группы такой-то, а так же из группы другой-то только по четвергам, если обращаются к какому-то конкретному ресурсу) — это же тоже по сути фильтрация запросов на доступ по какому-то сложному критерию.

К примеру, на хабре нет возможности найти все посты в определенных хабах с определенными тегами за указанный период. Как это реализовать? SQL строчку из мира брать — опасно очень. Сделать свой advanced search? Можно, но во-первых сложно (для каждого критерия надо формочку/поле), во-вторых, все равно это не будет гибче текстового выражения — критерии будут либо объединены по И либо по ИЛИ, либо придется вообще какой-то невероятной сложности страничку делать чтобы реализовать выражение вроде: post.date>20100101 and («security» in post.tags or «python» in post.tags)
Спасибо, теперь всё встало на место! :-)
А ссылочку на исходники не подскажете?
там все в одном __init__.py, можно pip'ом взять и посмотреть. ну или на битбакете: bitbucket.org/yaroslaff/evalidate
success, result = evalidate.safeeval(src,book)

Вот этот код очень сильно попахивает C-подобными языками. В питоне принято использовать исключения для таких вещей, которые вы используете внутри evalidate.safeeval, но почему-то стесняетесь выбрасывать наружу. Было бы неплохо сделать что-то вроде такого:
try:
    evalidate.safeeval(src, book)
except evalidate.ValidationError:
    pass  # отображение ошибок, записи в логи, etc


Кроме того, стоит натравить pep8 и pep257 на исходники, чтобы привести код к общепринятым style guide.
Да, согласен. Но нет — не стесняюсь, сам главный метод — evalidate.evalidate — он «публичный», на rtfd описан, и примеры с ним там есть, просто эта статья — он как «реклама», просто чтобы кратко показать что умеет модуль и зачем он нужен, поэтому тут пример покороче и попонятнее, ближе к самому eval() по синтаксису. А try/except на мой взгляд сильно загромождают код и производят впечатления «сложности». То есть, для продакшна — уместны, а для короткого примера — мне кажутся оверкиллом.

Насчет pep — хороший совет, спасибо, не знал о них. Сейчас погоняю-посмотрю.
try/except — это точно такая же общепринятая норма в питоне как и pep8. В вики питона как раз рассматривается ваш случай: wiki.python.org/moin/HandlingExceptions#Isn.27t_it_better_to_prevent_then_to_remediate.3F
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации