实验性PublishTraverse实现。
项目描述
对Zope发布的对象更加严格。在这里发布意味着:当浏览器访问URL时,你会得到一个响应。
请参阅在dexterity pull request和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未找到”错误。
如果你想要深入了解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。
接受的真值是:true、t、1、yes、y。
默认值旨在适用于最新的官方Plone版本,但默认值可能会更改。
安装
通过将其添加到您的buildout中安装experimental.publishtraverse
[buildout] ... eggs = experimental.publishtraverse
然后运行 bin/buildout
不需要zcml。
兼容性
在Plone 4.3、5.0、5.1上表现良好。
贡献
许可证
项目采用GPLv2许可。
贡献者
Maurits van Rees, maurits@vanrees.org
变更日志
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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 66fa211cb0525b19dfad292e3e7af222ef7eeb8f57e5975a140ea7a312d4e408 |
|
MD5 | a7604ac9b7ed22b24ea67523212faf4a |
|
BLAKE2b-256 | f58a7fd95c3450340e2a4ceb7c0fb1c517fbef36064e2bcebb1e04b9eb384075 |