Plone中isURLInPortal方法的实现
项目描述
isURLInPortal补丁为Plone
这个补丁修复了Plone中的isURLInPortal方法。该方法位于Products.CMFPlone/URLTool.py中的URLTool类。在页面模板中的基本用法是
<a tal:define="url request/came_from" tal:attributes="href url" tal:condition="python:context.portal_url.isURLInPortal(url)"> This link is only shown when it is somewhere in the Plone portal. </a>
isURLInPortal方法做什么?
Plone中的isURLInPortal方法在几个地方使用。它检查一个URL是否(可能)在当前Plone站点内。如果是这样,那么这个URL可以安全地重定向,或者可以安全地在页面上显示。
例如,如果你的站点是http://demo.plone.org,那么这些URL在该站点中
完整URL: http://demo.plone.org/some-folder/some-page
相对URL: some-folder/some-page,/somewhere/else,../in/parent
这些不在站点中
example.org
otherdomain.plone.org
代码不会检查是否在URL中实际找到了某些内容。它只检查URL是否在站点内。
如果这个方法无法完成其任务,那么攻击者就可以成功攻击。攻击可能看起来像这样
攻击者向您发送一封带有专门链接的电子邮件。或者攻击者将此链接发布在您常访问的知名网站上。
该链接指向您知道并信任的Plone站点,因此您点击了它。
您看到了预期的Plone站点。也许您登录了,但这可能不是必需的。
然后会发生以下情况之一
开放重定向:页面上某处有一个链接指向恶意网站。在钓鱼攻击中,此网站可能看起来像是您预期的Plone站点。
开放重定向:您会自动重定向到恶意网站。
反射型XSS(跨站脚本):加载了恶意javascript,它从页面中抓取私人信息并发送给攻击者。或者它用于以您的名义创建内容,包含更多恶意代码或垃圾邮件。
存储型XSS:如果您以编辑的身份登录到Plone,恶意javascript将被存储,其他访客会加载它。
我们就不列出过去可能被这种方法欺骗的url类型了:没有必要给黑客和脚本小子更多想法。
热补丁
多年来,已经有许多安全热补丁来修补这种方法。通常这是因为有人向Plone安全团队报告了一个可能的漏洞。如果我们看到确实存在安全问题,那么我们必须决定是否发布热补丁。
为这种情况创建热补丁并向整个Plone社区发出警报,建议他们修补所有站点,可能会感觉有些过度。其中许多人可能并不容易受到攻击。例如
现代浏览器对其中的一些有保护措施,尤其是反射型XSS。我们收到过报告,由于这个原因,我们最初无法重现。
一些攻击仅针对已认证的用户。前端Web服务器可能已被设置为将登录表单重定向到仅内部可用的服务器。
一些攻击仅针对允许公开注册的站点,任何人都可以创建账户。这可能并不适用于大多数Plone站点。
可能有一个防火墙在位,可以防止这些攻击。易受攻击的请求甚至可能无法到达Plone。
额外问题:多个热补丁修补同一方法。如果您使用的是Plone 4.3.0,并且安装了所有热补丁,那么您有十一个。其中一些修补了这种方法。如果您首先加载最旧的热补丁,那么它应该可以正常工作。反其道而行也可能有效,尽管不推荐这样做。
但我们没有在所有其他热补丁的组合中测试热补丁。我们有时会测试几个,有时新热补丁会明确尝试首先加载旧热补丁。
这会对性能产生(可能很小)的影响:大多数热修补版本的这种方法都会执行特定的检查,然后调用原始方法。所以它可能看起来像这样
调用isURLInPortal。
此方法由PloneHotfix20200121修补,因此它执行自己的代码,然后调用原始方法。
此方法由PloneHotfix20171128修补,因此它执行自己的代码,然后调用原始方法。
最后是CMFPlone中的代码。
这三个版本有重叠,导致相同的代码被执行两到三次。
想法:单独的包
现在的想法是:将这种方法放入一个独立的包中。这个包将作为所有当前Plone版本的hotfix,至少是4.3及更高版本。CMFPlone的新版本将依赖于这个包,因此它将自动包含在内。新包将成为方法的官方位置。我们将从较新的CMFPlone版本中删除该方法。
如果之后检测到新的漏洞,我们将修复它并发布这个包的新版本。修复您的网站的方法将是:
编辑您的buildout的版本部分中新包的版本号。
停止网站。
运行buildout。
启动网站。
如果我们想的话,我们还可以将其宣布为hotfix。
由于所有hotfix都位于Products命名空间中,我们将此包放入相同的命名空间。此命名空间中的代码将由Plone/Zope自动加载。这也使得将此包的主要目录(isurlinportal)提取出来并将其放入旧式的products文件夹变得更容易。然后您只需重新启动Plone,无需运行buildout。这主要是针对那些维护不好的旧版Plone网站的问题。
版本号
您应始终使用与此Plone版本兼容的最新版本的此包。
主要/破坏性版本,X.0.0:可能修复了新的漏洞。请尽快更新。但这可能不支持较旧的Plone或Python版本,所以请阅读变更日志。如果您有较旧的Plone,请检查是否有较旧的更新。
次要/功能版本:x.Y.0:修复了新的漏洞。请尽快更新。
微小/错误修复版本:x.y.Z:修复了错误,但没有修复新的漏洞。在您方便的时候更新,或者如果遇到问题的话。
版本1.x与Plone 4.3、5.0、5.1、5.2、6.0兼容。版本2.x与Plone 6.0兼容。版本3.x与Plone 6.1及更高版本兼容。
报告漏洞或错误
如果您怀疑您找到了漏洞,请通过电子邮件联系Plone安全团队。如果您更喜欢更安全的方式,我们也可以通过电子邮件安排。
如果您看到非安全错误,您可以打开一个问题,或者创建一个pull request。如有疑问,请通过电子邮件联系我们。
变更日志
3.0.0 (2024-08-22)
破坏性更改
不再修补Products.CMFPlone。版本6.1.0a5将直接使用我们。这解决了循环依赖问题,与Plone 6.0不兼容。[maurits] (#12)
2.0.3 (2024-08-14)
文档
版本2.x与Plone 6.0兼容。版本3.x与Plone 6.1及更高版本兼容。版本3更改了此包集成到Plone核心的方式。[maurits] (#12)
2.0.2 (2024-01-22)
内部
更新配置文件。[plone开发者] (6e36bcc4, 7723aeaf)
2.0.1 (2023-04-19)
内部
更新配置文件。[plone开发者] (3333c742)
2.0.0 (2023-03-14)
破坏性更改
取消与Plone 5.2及以下版本的兼容性。[maurits] (#60)
1.2.1 (2021-08-10)
错误修复
当url不是字符串时返回False,例如None。注意:这不是安全修复。[maurits] (#8)
1.2.0 (2021-07-31)
新功能
将类似https:example.org的url(没有斜杠)视为不在门户之外。一些浏览器会重定向到example.org,一些会重定向到一个不存在的本地页面。我们绝对不希望这样,因为这很可能是黑客攻击。这个漏洞是由三井物产保安方向株式会社的Yuji Tounai发现的并报告的。见安全公告1。[maurits] (#1)
1.1.1 (2020-09-07)
错误修复
添加对Python 3.6 + 3.8的测试;添加Python 3.8 trove分类器。[tschorr] (#3)
1.1.0 (2020-08-16)
新功能
增强对url中棘手的空白处理的抵抗力。[maurits] (#1)
1.0.0 (2020-07-21)
初始版本。代码与当前Plone 4.3.19、5.1.6、5.2.1相同,应用了2020年1月的热修复,加上兼容性修复。[maurits]
项目详情
下载文件
下载您平台对应的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源分布
构建分布
哈希值 for Products.isurlinportal-3.0.0-py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | da340f01befef8c79792aa0e7ad3b5175be942360a7fa92cb5f155d75abd5e93 |
|
MD5 | 731d7ee695e5d461bd65b451ce35c0ed |
|
BLAKE2b-256 | dad7082c0b72256aee7d801af44228410c110d232b9a382c55867e23e6975f1f |