如何提供安全模板供用户使用python进行修改?
我正在构建一个多用户网络应用程序。 每个用户都可以在我的应用程序下拥有自己的网站。 我正在考虑如何允许用户修改模板而不存在安全问题? 我评估了一些 python 模板引擎。 例如,genshi,它是一个非常出色的模板引擎,但是允许用户修改genshi模板可能是危险的。 它有这样的语法:
<?python
?>
这个语法允许你运行任何你想要 python 能做的事情。 我注意到它似乎可以通过传递一些参数来关闭。 但仍然存在很多潜在的问题。 例如,用户可以访问内置函数和传递变量的方法。 例如,如果我将 ORM 对象传递给模板。 它可能包含一些我不想让用户触摸它的方法和变量。 可能是这样的:
site.metadata.connection.execute("drop table xxx")
所以我的问题是如何允许用户修改其网站的模板而不出现安全问题? 任何Python模板引擎都可以使用。
谢谢。
I am building a multi-user web application. Each user can have their own site under my application. I am considering how to allow user to modify template without security problem? I have evaluated some python template engine. For example, genshi, it is a pretty wonderful template engine, but however it might be dangerous to allow user to modify genshi template. It have a syntax like this:
<?python
?>
This syntax allow you run whatever you want python can do. I notice that it seems can be shutdown by passing some parameter. But there are still a lots of potential problems. For example, user can access build-in functions, and methods of passed variables. For example, if I pass a ORM object to template. It might contain some method and variable that I don't want to allow user touch it. May like this:
site.metadata.connection.execute("drop table xxx")
So my question is how can I allow user to modify template of their site without security problems? Any python template engine can be used.
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
Jinja2 是一个类似 Django 的模板系统,具有沙箱功能。 我从未尝试过使用沙箱,但我非常喜欢 Jinja2 作为 Django 模板的替代品。 它仍然提倡模板与业务逻辑的分离,但具有更多 Pythonic 调用约定、命名空间等。
Jinja2 Sandbox
Jinja2 is a Django-ish templating system that has a sandboxing feature. I've never attempted to use the sandboxing, but I quite like Jinja2 as an alternative to Django's templates. It still promotes separation of template from business logic, but has more Pythonic calling conventions, namespacing, etc.
Jinja2 Sandbox
查看 Django 模板引擎。 它不支持执行任意Python代码,并且所有可访问的变量必须显式传递到模板中。 这应该是构建用户可定制页面的良好基础。 请注意,您仍然需要处理用户偶尔出现的语法错误。
Look at Django templte engine. It does not support execution of arbitrary python code and all accessible variables must be passed into template explicity. This should be pretty good foundation for building user-customizable pages. Beware that you'll still need to handle occasional syntax errors from your users.
在 Rails 中,有一种叫做 liquid 的东西。 您可能会看一下以获得一些想法。 另一个想法:至少,您可以做的一件事是将对象转换为简单的字典 - 类似于 json 表示形式,然后传递给模板。
In rails there's something called liquid. You might take a look at that to get some ideas. Another idea: at the very least, one thing you could do is to convert your objects into simple dictionary - something like a json representation, and then pass to your template.
简短的回答可能是“你不能”。
您能做的最好的事情就是将单个用户困在虚拟机或沙箱中。
The short answer is probably "you can't".
The best you can probably do is to trap the individual users in virtual machines or sandboxes.