实验性 PublishTraverse 实现。
项目描述
对 Zope 发布的内容更加严格。在这里发布意味着:当浏览器访问一个 url 时,你会得到一个响应。
请参阅关于敏捷性拉取请求 和CMFPlone 问题的讨论。
特征
这与 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 Not Found”错误。
如果您想深入了解 Zope 发布对象时内部发生的情况,请参阅 Martin Aspeli 关于Zope Secrets的优秀文章。
选项
该包查找这些环境变量:
- EXPERIMENTAL_PUBLISH_TRAVERSE_ONLY_WARN
设置此选项时,不会拒绝发布对象,而是会记录警告。默认值:假。
- EXPERIMENTAL_PUBLISH_TRAVERSE_ACCEPT_KNOWN_NAMES
设置此项后,将考虑已知名称列表:当发布具有已知名称中名称的对象时,我们无需进一步检查即可接受它。默认值:真。
- EXPERIMENTAL_PUBLISH_TRAVERSE_ACCEPT_IF_ONLY_FOR_ADMINS
设置此选项后,如果可发布对象不受保护但其容器仅供管理员访问,我们无论如何都会接受它。如果它的类具有security.declareObjectProtected(ManagePortal),就会发生这种情况,就像您在 ZMI 中使用工作流状态的权限形式时发生的那样。在这种情况下,管理员是具有管理员或站点管理员角色的人。默认值:真。
接受的 True 值为:true、t、1、yes、y。
默认值旨在对最新的官方 Plone 版本合理,但默认值可能会更改。
安装
通过将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来关闭此 功能。[毛里求斯]
Bug修复:
在 plone.app.codeanalysis 的帮助下,添加了额外的测试并提高了包的代码质量。[毛里求斯]
1.0 (2016-09-28)
初始发行。[毛里求斯]
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。