跳转到主要内容

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]

项目详情


下载文件

下载您平台对应的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

products_isurlinportal-3.0.0.tar.gz (15.3 kB 查看哈希值)

上传时间

构建分布

Products.isurlinportal-3.0.0-py3-none-any.whl (10.6 kB 查看哈希值)

上传时间 Python 3

由以下提供支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面