跳转到主要内容

实验性PublishTraverse实现。

项目描述

对Zope发布的对象更加严格。在这里发布意味着:当浏览器访问URL时,你会得到一个响应。

请参阅在dexterity pull requestCMFPlone问题上的讨论。

功能

此功能与Zope的默认发布遍历程序挂钩。它应该对repoze也有效,但尚未测试。它的工作方式与默认发布者相同,但在发布方面更加严格。

最大的区别是:只有当对象具有安全断言时,对象才会被发布。

换句话说:必须有权限检查。如果任何人都可以访问对象而无需检查他们是否具有查看权限,则我们拒绝显示它。

为什么使用这个?

过去几年中,已经发布了几个针对Plone的安全热补丁,这些热补丁明确使对象不可发布。作为匿名用户,您可以通过URL访问一些您不应该看到的信息,而热补丁解决了这个问题。

此实验性包不会自动修复所有此类问题。但它为这类问题提供了一种修复方法:任何未经安全检查即可访问的对象。

不会修复具有适当权限检查但最终不应该对浏览器可用的发布对象。有几个方法具有适当的权限检查,以便只有授权用户才能从受限制的代码(如Python皮肤脚本或模板)中使用这些功能。但当他们也有一个docstring时,Zope默认允许它们被发布,并不是每个人都会意识到这一点。这个实验性包对此没有任何作为:它没有方法知道发布正确受保护的方法是有意为之还是无意为之。

注意,还有其他使对象可发布的方法:浏览器视图和命名空间发布都是使对象可发布的明确且好方法,它们不受此包的影响。

它是否有效?

尝试在您的Plone站点url的末尾添加/ZopeTime。它应该加载失败。

详细信息

获取用于发布的对象是通过Zope的BaseRequest类在其traverse方法中完成的。它有这段代码

adapter = queryMultiAdapter((object, self),
                            IBrowserPublisher)
if adapter is None:
    # Zope2 doesn't set up its own adapters in a lot
    # of cases so we will just use a default adapter.
    adapter = DefaultPublishTraverse(object, self)

因此我们做的是:注册一个适配器,该适配器被上述代码选中。基础是这个zcml注册

<adapter
    factory=".traverser.StrictPublishTraverse"
    for="* zope.publisher.interfaces.browser.IBrowserRequest"
    />

这指向traverser.py,我们在其中有一个继承自这两个类之一的StrictPublishTraverse

try:
    from repoze.zope2.publishtraverse import DefaultPublishTraverse
except ImportError:
    from ZPublisher.BaseRequest import DefaultPublishTraverse

由于继承,StrictPublishTraverse类实现了zope.publisher.interfaces.browser.IBrowserPublisher,这正是我们想要的。

这个类允许原始类执行其工作,返回一个对象和一个路径。但它随后会对对象进行额外的检查

  • 它的名字是否在KNOWN_NAMES列表中?然后我们发布它。目前这只有index_html,这是一个使用得很频繁的名字,即使你看不到它在url中。

  • 如果对象是一个方法或函数?那么我们会检查它是否有安全断言。所以:你需要什么角色或权限才能访问它?如果需要角色或权限,而访问者没有,那么这一点将永远不会达到:一个未授权的错误已经被抛出。如果没有需要角色或权限,那么我们就做这个改变,这是这个包存在的唯一原因:我们拒绝发布此项目。这会显示为“404未找到”错误。

如果你想要深入了解Zope发布对象时内部发生的事情,请参阅Martin Aspeli关于Zope秘密的出色文章。

选项

该包寻找以下环境变量

EXPERIMENTAL_PUBLISH_TRAVERSE_ONLY_WARN

当这个值被设置时,而不是拒绝发布对象,它会记录一条警告。默认:false。

EXPERIMENTAL_PUBLISH_TRAVERSE_ACCEPT_KNOWN_NAMES

当这个值被设置时,会考虑已知名称列表:当一个具有已知名称的对象被发布时,我们接受它而不再进行进一步检查。默认:true。

EXPERIMENTAL_PUBLISH_TRAVERSE_ACCEPT_IF_ONLY_FOR_ADMINS

当这个值被设置时,如果可发布的对象没有保护,但其容器仅对管理员可访问,我们仍然接受它。这可能发生,如果它的类有security.declareObjectProtected(ManagePortal),就像你在ZMI中使用工作流状态权限表单时发生的那样。在这种情况下,管理员是具有Manager或站点管理员角色的任何人。默认:true。

接受的真值是:truet1yesy

默认值旨在适用于最新的官方Plone版本,但默认值可能会更改。

安装

通过将其添加到您的buildout中安装experimental.publishtraverse

[buildout]
...
eggs =
    experimental.publishtraverse

然后运行 bin/buildout

不需要zcml。

兼容性

在Plone 4.3、5.0、5.1上表现良好。

贡献

许可证

项目采用GPLv2许可。

贡献者

变更日志

1.1 (2016-11-17)

新功能

  • 当容器仅对管理员可访问时发布对象。您可以通过security.declareObjectProtected(ManagePortal)来实现这一点。这解决了为工作流状态设置权限的问题。您可以通过将新选项EXPERIMENTAL_PUBLISH_TRAVERSE_ACCEPT_IF_ONLY_FOR_ADMINS设置为false来关闭此功能。[maurits]

错误修复

  • 添加了test额外内容和通过plone.app.codeanalysis提高了包的代码质量。[maurits]

1.0 (2016-09-28)

  • 初始发布。[maurits]

项目详情


下载文件

下载适合您平台的应用程序。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源代码分发

experimental.publishtraverse-1.1.tar.gz (18.5 kB 查看哈希值)

上传时间 源代码

由以下机构支持