【问题标题】:How can I provide safety template for user to modify with python?如何提供安全模板供用户使用 python 进行修改?
【发布时间】:2010-10-07 17:05:27
【问题描述】:

我正在构建一个多用户 Web 应用程序。每个用户都可以在我的应用程序下拥有自己的站点。我正在考虑如何允许用户在没有安全问题的情况下修改模板?我已经评估了一些 python 模板引擎。例如,genshi,它是一个非常棒的模板引擎,但是允许用户修改 genshi 模板可能是危险的。它的语法如下:

<?python

?>

这种语法允许你运行任何你想要 python 可以做的事情。我注意到它似乎可以通过传递一些参数来关闭。但仍有很多潜在的问题。例如,用户可以访问内置函数和传递变量的方法。例如,如果我将 ORM 对象传递给模板。它可能包含一些我不想让用户触摸它的方法和变量。可能会这样:

site.metadata.connection.execute("drop table xxx")

所以我的问题是如何允许用户在没有安全问题的情况下修改其网站的模板?可以使用任何python模板引擎。

谢谢。

【问题讨论】:

    标签: python web templates


    【解决方案1】:

    Jinja2 是一个 Django 风格的模板系统,具有沙盒功能。我从未尝试过使用沙盒,但我非常喜欢 Jinja2 作为 Django 模板的替代品。它仍然促进模板与业务逻辑的分离,但有更多的 Pythonic 调用约定、命名空间等。

    Jinja2 Sandbox

    【讨论】:

    • Jinja 真的很棒。我喜欢在模板中定义宏(很像函数)的可能性。 {{ navitem(文本,链接)}}
    • 好建议 - 该 URL 不再有效,但这适用于 3.0 系列:jinja.palletsprojects.com/en/3.0.x/sandbox
    【解决方案2】:

    看看Django templte engine。它不支持执行任意 python 代码,并且所有可访问的变量都必须显式传递到模板中。这应该是构建用户可定制页面的很好的基础。请注意,您仍然需要处理用户偶尔出现的语法错误。

    【讨论】:

    • 谢谢,我评估了django模板引擎,非常好。它甚至不允许用户访问以“_”开头的属性,因此它足够安全以允许用户使用它。
    • 这里派上用场的 Django 模板引擎的另一个特性是您可以在任何函数或对象方法上设置“alters_data”属性,这将阻止它在模板中被调用。
    【解决方案3】:

    在 Rails 中有一个叫做liquid 的东西。你可以看看那个以获得一些想法。另一个想法:至少,您可以做的一件事是将您的对象转换为简单的字典 - 类似于 json 表示,然后传递给您的模板。

    【讨论】:

      【解决方案4】:

      简短的回答可能是“你不能”。

      您可能做的最好的事情就是将单个用户困在虚拟机或沙箱中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-17
        • 2017-03-29
        • 1970-01-01
        相关资源
        最近更新 更多