跳转到主要内容

Plone的防垃圾邮件蜜罐

项目描述

简介

此包为表单提供蜜罐保护。

用例

垃圾邮件发送者已经找到你,并且正在猛击你网站上的各种表单。主要受害者是加入表单、联系表单、发送到表单和评论表单。

也许你已经在某些地方设置了验证码保护,但垃圾邮件发送者已经找到了绕过它的方法。或者你希望在花费大量时间验证之前先检测到垃圾邮件发送者。

你已经注意到,一些脚本即使在收到GET请求而不是POST请求时也会发送电子邮件或添加评论。

你不想设置任何不友好的验证码,但也不想让垃圾邮件发送者太容易。

或者,换一个角度,你想知道在执行大型迁移时,是否可以暂时禁止所有POST请求。

想法

一个已经得到应用的防垃圾邮件想法是蜜罐:添加一个人类永远不会填写的字段。其逻辑是,垃圾邮件发送者可能会填写表单中的所有字段,原因有两个

  1. 机器人不知道哪些字段是必须的,所以它们填写一切,只是为了确保。

  2. 提交成功后,每个字段可能会在网站上显示出来,所以它们填写所有字段以将信息显示在不知情访客面前。

该字段应该被隐藏,以免分散人类的注意力。但是:将输入类型设置为隐藏可能意味着垃圾邮件发送者会忽略它,最终并没有填写它,所以我们用CSS将其隐藏。

一些垃圾邮件机器人似乎对Plone有所了解。它们知道在没有验证码的标准Plone网站上的一些表单中哪些字段是必须的,或者它们甚至知道绕过验证的方法。如果我们添加一个不可见的字段,它们将简单地不使用它。所以:对于一些明确选定的表单,我们要求不可见的字段必须出现在提交的表单中,尽管它必须是空的。

安装和使用

collective.honeypot添加到你的zope实例的buildout配置中的eggs。

[instance]
eggs =
    collective.honeypot

运行buildout并启动zope实例。

这会做什么?

  • 这为几个模板和脚本注册了覆盖(使用z3c.jbot)。

  • 它将这些模板和脚本添加到额外受保护的操作列表中。这意味着对这些操作的POST请求现在必须包含蜜罐字段,并且它必须为空。

修复

一些标准的Plone脚本在你使用GET请求时很高兴地添加评论或发送电子邮件。这个包不同意这种政策,并修复了需要POST请求的问题。

当使用z3c.jbot时,该包会检测哪些修复是必需的。某些插件可能可用或不可用,所以我们只加载可以应用的修复,特别是针对plone.app.discussion

如果你通过自己的皮肤层或通过某些zcml覆盖了脚本或模板,那么我们的修复可能没有效果,所以你需要自己进行修复。

那么,这个包实际上包含哪些修复?

  • 一些表单可能会自动获得不可见的蜜罐字段。此包注册了对plone.protect中的@@authenticator视图的覆盖,该视图用于多个模板中的csrf保护(跨站请求伪造)。所以任何已经使用这个的模板会自动加载我们的蜜罐字段。

  • plone.app.discussion:

    • 将蜜罐字段添加到“添加评论”表单中。此修复仅在加载fixes.zcml时执行。

    • 蜜罐字段不是必需的,因为“添加评论”表单将数据发送到上下文,而不是发送到特定的操作。

  • Plone

    • 要求send_feedback_sitesendto脚本需要POST请求。

    • 将蜜罐字段添加到 sendto_formcontact-info 表单中。

    • 注册表单由我们的 @@authenticator 覆盖自动保护。

    • 对于上述操作和加入表单,需要要求蜜罐字段,具体为: sendto_formsendtocontact-infosend_feedback_siteregisterjoin_form

保护您的表单

在您想要保护的表单中,您必须添加以下内容:

<div tal:replace="structure context/@@honeypot_field|nothing" />

这已经足够实现基本的无形字段保护,如果垃圾邮件发送者填写了它,将会引发一个 Forbidden 异常。

某些表单可能自动获得这个无形字段。此包为 plone.protect 中的 @@authenticator 视图注册了一个覆盖,该视图用于多个模板中的 csrf 保护(跨站请求伪造)。因此,任何已经使用此模板的模板都将自动加载我们的蜜罐字段。

为了额外的保护,您可以将在表单中显示的页面添加到 EXTRA_PROTECTED_ACTIONS。这意味着如果该字段在表单中根本未提交,也将引发 Forbidden 异常。请参阅 配置 部分。

请注意,接受所有已验证用户的所有帖子可能很好,但我们的代码在 Zope 流程中运行得太早:我们尚不知道用户是否已登录。

配置

您无法在 Plone 站点内进行任何配置。那会太容易出错,甚至可能禁用撤销损坏的手段。此外,在一个 Zope 实例中存在多个 Plone 站点时,这将变得更加复杂。因此,我们选择了不同的方法。

您可以通过在您的 zope 实例的 zope.conf 中设置环境变量来配置设置。对于测试,您可以在您的命令外壳中设置一个环境变量并启动 zope 实例,它将自动获取。但通常的方法是在 buildout.cfg 中进行此操作。

[instance]
environment-vars =
    HONEYPOT_FIELD pooh
    EXTRA_PROTECTED_ACTIONS discussion_reply join_form sendto_form
    ALLOWLISTED_ACTIONS jq_reveal_email
    ALLOWLISTED_START jq_*
    IGNORED_FORM_FIELDS secret_field
    ACCEPTED_LOG_LEVEL info
    SPAMMER_LOG_LEVEL error
    DISALLOW_ALL_POSTS no

一般说明

  • 没有选项是必需的。即使没有任何环境变量,它也可以正常工作。

  • 值由空格或逗号分隔。

  • 任何 @ 字符都会自动替换为空格,以便通过简单地使用 some_view 来引用 @@some_view,因为我们始终都保护它们。

这些是支持的变量

HONEYPOT_FIELD

用作蜜罐字段输入名称的名称。如果您在这里不提供值,则不会进行蜜罐检查,因此您只能获得一些日志记录。这显然不是此包的主要目标,但它可能在您需要执行一些调试时很有用。如果您没有列出变量,则获取默认值 protected_1。如果垃圾邮件发送者了解到此包并未填写标准名称,您可以在此处更改名称。

EXTRA_PROTECTED_ACTIONS

对于这些表单操作,需要蜜罐字段:尽管该字段当然仍然是空的,但它必须出现在已提交的请求中。如果您在此处添加操作但未更改表单,则表单将无法为访客使用,这不是您想要的。另一方面,如果您有不再希望使用的表单,您可以在此处添加它,并且它将停止工作。对于 @@view,请简单地使用 view,它将匹配两者。

ALLOWLISTED_ACTIONS

这些表单操作未进行检查。在此列出无害的操作,例如通过AJAX调用加载数据的操作。一般来说,不更改数据库且不发送电子邮件的操作可以安全添加到此处。如果您添加了此环境变量但留空,则会覆盖默认设置,不允许任何操作。默认情况下,我们允许以下操作

  • at_validate_field(行内验证)

  • atct_edit(编辑表单)

  • edit(编辑表单)

  • kssValidateField(行内验证)

  • jq_reveal_emailzest.emailhider

  • z3cform_validate_field(行内验证)

ALLOWLISTED_START

以这些字符串之一开始的表单操作不会进行检查。有关更多信息,请参阅ALLOWLISTED_ACTIONS。如果您有很多以jq_开头的无害操作,可以将该字符串添加到此列表。正则表达式很容易出错,所以我们不支持它。

IGNORED_FORM_FIELDS

我们记录关于POST请求的信息,以便系统管理员可以遍历日志并发现显然是垃圾邮件尝试但尚未捕获并需要额外处理的帖子,可能需要额外的表单以获得保护。这些信息可能包含应保持机密或不感兴趣的字段。无论您填写什么,我们总是忽略包含“密码”一词的字段。

ACCEPTED_LOG_LEVEL

接受帖子的日志级别。它接受标准的低或大写日志级别:debug、info、warn、warning、error、critical。当使用未知级别或设置空时,我们将回退到默认值:INFO

SPAMMER_LOG_LEVEL

捕获垃圾邮件的日志级别。它接受标准的低或大写日志级别:debug、info、warn、warning、error、critical。当使用未知级别或设置空时,我们将回退到默认值:ERROR

DISALLOW_ALL_POSTS

将此设置为1ontrueyes以拒绝所有POST请求。如果您想将Plone站点设置为只读,例如在安全发布准备中或在新Zope实例中进行大型迁移时保持旧实例运行,这可能很有用。请注意,与其它检查一样,这仅影响Plone(或CMF)站点,而不是Zope根。

检查什么时候没有做?

此包不会检查任何GET请求的字段,它实际上在所选表单上阻止GET请求,并要求在那里进行POST操作。因此,字段检查仅在POST请求上起作用。

如果您已将HONEYPOT_FIELD配置选项留空,则不会执行蜜罐检查,因此您只会获得一些日志记录。

如果Zope进行任何遍历,则仅检查原始操作。例如

  • 访客向my_form操作发出POST请求。为此操作执行蜜罐检查。

  • my_form操作可能是一个旧式CMF表单控制器操作,该操作调用验证脚本validate_my_form。此验证脚本不执行蜜罐检查。

  • 验证后,操作可能执行到脚本do_action的遍历,该脚本执行实际工作,如更改数据库或发送电子邮件。此脚本不执行蜜罐检查。

顺便说一句,如果你有这种设置,你应该确保do_action脚本也调用验证脚本,并且只接受POST请求。否则,一个聪明的垃圾邮件发送者可以通过直接请求do_action脚本来绕过validate_my_form验证脚本。他还可以通过使用GET请求来绕过蜜罐检查。

z3c.form

你可以轻松地将蜜罐字段添加到z3c.form中。只需将一个TextLine字段添加到你的表单Interface定义中,将widgetFactory设置为collective.honeypot提供的小部件,并使其隐藏。例如:

from collective.honeypot.z3cform.widget import HoneypotFieldWidget
from z3c.form import form, interfaces
from zope import schema
from zope.interface import Interface

class IHoneypot(Interface):
    # Keep field title empty so visitors do not see it.
    honeypot = schema.TextLine(title=u"", required=False)

class MyForm(form.Form):
    fields = form.field.Fields(IHoneypot)

    def update(self):
        self.fields['honeypot'].widgetFactory = HoneypotFieldWidget
        self.fields['honeypot'].mode = interfaces.HIDDEN_MODE

请参阅collective/honeypot/discussion/z3cformextender.py,了解如何扩展现有表单的示例,在这种情况下,是plone.app.discussion中的评论表单。

兼容性

这适用于Plone 5.2。

变更日志

3.0.0 (2024-06-18)

  • 将所有环境变量中的“WHITELISTED”替换为“ALLOWLISTED”。为了向后兼容,仍然会检查旧拼写。修复了问题20。 [maurits]

  • 放弃对低于3.8的Python版本的支持。[maurits]

  • 添加对Plone 6.0和6.1的plone.app.z3cform.templates.macros.pt的覆盖。[szakitibi, maurits]

2.1.1(未发布)

  • 添加西班牙语翻译。[macagua]

2.1 (2022-11-04)

  • 添加对restapi POST的支持。[cekk]

  • 支持在Py 2.7+3.7+3.8上的Plone 5.2和在Py 3.8+3.9+3.10上的Plone 6.0。[maurits]

  • 在GitHub Actions上测试而不是在Travis上。[maurits]

2.0 (2021-01-27)

  • 如果包被加载,则自动加载修复项。不再需要显式包含fixes.zcml。[thet]

  • 如果可用,使用蜜罐保护collective.easyform。[thet]

  • 添加一个通用的z3c.form蜜罐扩展模块,可以通过ZCML进行配置,并配置plone.app.discussion使用它。[thet]

  • 添加一个虚拟小部件显示视图,它渲染空内容 - 表单渲染可能期望它。[thet]

  • 为z3c.form验证添加数据转换器,以便在注入多个HoneyPot字段时不会失败。[thet]

  • 更新以支持Plone 5.2和Python 3。移除对Plone 3和4的支持。[thet, reinhardt]

1.0.3 (2020-04-08)

  • 修复适配器注册冲突。[rodfersou]

1.0.2 (2015-10-01)

  • 拆分蜜罐字段和验证器视图。当调用@@authenticator`时,返回视图而不渲染它。修复了例如在PloneFormGen快速编辑表单上的AttributeError: 'unicode' object has no attribute 'token'。[maurits]

  • 添加到readme的Travis徽章。[maurits]

1.0.1 (2015-08-25)

  • 要求send_feedback脚本使用POST。此脚本只能由认证用户使用,因此风险很小,但POST仍然更好。[maurits]

1.0 (2015-08-24)

  • 第一个官方公共版本。

  • 将kssValidateField添加到默认的ALLOWLISTED_ACTIONS中,以抑制在Plone <= 4.2上记录kss内联验证。[fredvd]

0.7 (2014-04-18)

  • 添加GenericSetup配置文件,它添加了带有我们的修复程序的皮肤层。这在Plone 3上推荐使用。原因是这种技术不需要z3c.jbot,这在Plone 3中可能有一些丑陋的副作用:Products.CacheSetup不喜欢它,在其他情况下Zope甚至无法启动。[maurits]

0.6 (2014-04-17)

  • 默认允许编辑表单。[maurits]

  • 记录我们加载补丁和添加额外受保护的操作时的日志。[maurits]

0.5 (2014-04-16)

  • 支持不允许所有帖子。[maurits]

  • 支持检查允许的操作的起始字符串。[maurits]

  • 允许配置日志级别。[maurits]

  • 在记录表单时打印更少。[maurits]

0.4 (2014-04-15)

  • quintagroup.plonecomments添加修复。[maurits]

  • 为Plone 3添加修复。[maurits]

0.3 (2014-03-14)

  • 从默认依赖项中删除z3c.jbot,以便最后一个更改实际上可以工作。[maurits]

0.2 (2014-03-14)

  • z3c.jbot 作为 collective.honeypot[fixes] 的额外依赖项。这样,您只有在需要时才会获得 z3c.jbot。 [maurits]

0.1 (2014-03-14)

  • 初始发布。 [maurits]

项目详情


下载文件

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

源分发

collective.honeypot-3.0.0.tar.gz (39.0 kB 查看哈希值)

上传时间

构建分发

collective.honeypot-3.0.0-py3-none-any.whl (39.0 kB 查看哈希值)

上传时间 Python 3

由以下组织支持