如何创建一个简单的蜜罐来保护您的表单免受垃圾邮件发送者的攻击

2025-06-05

如何创建一个简单的蜜罐来保护您的表单免受垃圾邮件发送者的攻击

我认为这篇文章简短实用。本文旨在演示一种简单的技巧,帮助您屏蔽可能攻击您网站表单的垃圾邮件发送者和机器人程序。这旨在作为垃圾邮件防护的额外保障,而非主要手段。请配合 reCaptcha 等其他工具使用。由于其简洁易用,我强烈建议您遵循以下表单模式,那么,让我们开始编写代码:

假设您有以下表单结构:

<form id="myformid" action="/myformaction">
    <label for="name">Your Name</label>
    <input type="text" id="name" name="name" placeholder="Your name here" required maxlength="100">
    <label for="email">Your E-mail</label>
    <input type="email" id="email" name="email" placeholder="Your e-mail here" required>
</form>
Enter fullscreen mode Exit fullscreen mode

大多数简单的机器人会搜索常见的模式,例如标签常用名称、输入ID、输入常用属性、必填字段等,然后机器人会用虚假信息填充这些信息,试图向您和您的客户发送垃圾邮件或恶意代码。最常搜索的字段是名为“电子邮件、电话、地址”的字段……

因此,让我们对此进行欺骗并通过将表单结构更改为来创建一个简单的蜜罐:


<style>
    .ohnohoney{
        opacity: 0;
        position: absolute;
        top: 0;
        left: 0;
        height: 0;
        width: 0;
        z-index: -1;
    }
</style>

<form id="myformid" action="/myformaction">
    <!-- Real fields -->
    <label for="nameaksljf">Your Name</label>
    <input type="text" id="nameksljf" name="nameksljf" placeholder="Your name here" required maxlength="100">
    <label for="emaillkjkl">Your E-mail</label>
    <input type="text" id="emaillkjkl" name="emaillkjkl" placeholder="Your e-mail here" required>
    <!-- H o n e y p o t -->
    <label class="ohnohoney" for="name"></label>
    <input class="ohnohoney" autocomplete="off" type="text" id="name" name="name" placeholder="Your name here">
    <label class="ohnohoney" for="email"></label>
    <input class="ohnohoney" autocomplete="off" type="email" id="email" name="email" placeholder="Your e-mail here">
</form>
Enter fullscreen mode Exit fullscreen mode

让我们看看变化:

首先,我们创建了一个用来隐藏内容的类,也就是 .ohnohoney 类。现在需要注意的是:

  1. 不要使用 display:none,有些机器人无法访问带有 display: none 的字段,而有些机器人则知道不应该填充 display: none 字段。不要在类名中使用“hidden”,一些高级机器人可以识别它。

  2. 然后我们创建了“真实字段”。这些字段是可见字段,并且必须与后端数据相关。这些字段的标识必须更改为哈希值。我通常使用“nameHASH”格式。不要使用“name-hash”或其变体,简单的拆分就会暴露真实的字段名称。现在,机器人无法识别这些字段是什么,它们只知道表单中有一些必须填写的字段,可能遵循“type”格式。

  3. 通过创建“蜜罐”字段,我们将能够识别垃圾邮件发送者。重要提示:将标签留空,使用“ohnohoney”类隐藏所有虚假输入。将虚假输入尽可能简单、通用且具有吸引力。使用简单且常用的名称,例如“电子邮件、电话、姓名等”,禁用自动完成功能(这样浏览器就不会自动填充),禁用规则,但保留类型。

现在我们的表单中有两部分:真实字段,其输入受哈希值和奇怪的名称保护(您可以根据自己的喜好实现哈希值或奇怪的名称)。以及我们的蜜罐(不要写“蜜罐”,最好将字母分开以避免被识别)。现在在您的后端:

  1. 验证是否有任何“蜜罐”字段已填写。如果已填写,恭喜,您捕获了垃圾邮件。大多数垃圾邮件会填写所有字段,且不加区分。因此,您只需检查是否有任何“蜜罐”字段已填写,如果已填写,则为垃圾邮件。如果您愿意,可以在客户端进行此检查,例如使用 Ajax 表单,这样可以避免服务器资源计算无用数据(但仍然保留后端验证)。捕获垃圾邮件后,请勿发送数据,并对其进行任何处理。如果“电子邮件、电话等”等姓名对您的后端很重要,则只需使用数组记录姓名即可。

这是一个单文件 repo,其中包含此技术的简单实现:
https://github.com/felippe-regazio/php-honeypot-example

请记住:这只是一个简单的防御层,可以以简单的方式阻止攻击,有些技术甚至可以识别这种模式,所以要使用所有可能的武器来对抗它。但我相信,这个简单的模式至少可以避免网页中 50% 的垃圾信息。

文章来源:https://dev.to/felipperegazio/how-to-create-a-simple-honeypot-to-protect-your-web-forms-from-spammers--25n8
PREV
最小限度地使用 JavaScript 来实现舒适的编码和渲染框架前端
NEXT
CSS 自定义属性(vars)与 SASS/SCSS,一种实用的架构策略