passport-it/laravel-honeypot

防止通过表单提交的垃圾邮件

dev-master 2023-06-09 08:41 UTC

This package is auto-updated.

Last update: 2024-09-09 11:10:32 UTC


README

这是一个spatie/laravel-honeypot的分支,可以在升级到PHP8后与Laravel 6 (LTS)一起使用。上游包只保留对PHP7和Laravel 6的支持。

Latest Version on Packagist GitHub Workflow Status Quality Score StyleCI Total Downloads

当向公开网站添加表单时,存在垃圾邮件机器人会尝试用虚假值提交的风险。幸运的是,这些机器人中大多数都很笨拙。您可以通过在表单中添加一个不应包含值的不可见字段来阻止大多数机器人。这种字段被称为“诱饵”。这些垃圾邮件机器人会填写所有字段,包括诱饵。

当提交包含填充诱饵字段的表单时,此包将丢弃该请求。此外,此包还会检查表单提交所需的时间。这是通过另一个不可见字段中的时间戳来完成的。如果表单提交时间非常短,反垃圾邮件也会被触发。

安装此包后,您只需将@honeypot Blade指令添加到您希望保护的任何表单中。

<form method="POST">
    @honeypot
    <input name="myField" type="text">
</form>

视频教程

这个视频中,该视频是Mailcoach视频课程的一部分,您可以了解如何安装和使用此包。

支持我们

我们投入了大量资源来创建一流的开放源代码包。您可以通过购买我们的付费产品之一来支持我们。

我们非常感谢您从家乡寄给我们明信片,说明您正在使用我们哪个包。您可以在我们的联系页面上找到我们的地址。我们将所有收到的明信片发布在我们的虚拟明信片墙上

安装

您可以通过composer安装此包。

composer require lukeusher/laravel-honeypot dev-master

可选地,您可以发布包的配置文件。

php artisan vendor:publish --provider="Spatie\Honeypot\HoneypotServiceProvider" --tag=config

这是将发布到config/honeypot.php的配置文件内容。

use Spatie\Honeypot\SpamResponder\BlankPageResponder;

return [
    /*
     * Here you can specify name of the honeypot field. Any requests that submit a non-empty
     * value for this name will be discarded. Make sure this name does not
     * collide with a form field that is actually used.
     */
    'name_field_name' => env('HONEYPOT_NAME', 'my_name'),

    /*
     * When this is activated there will be a random string added
     * to the name_field_name. This improves the
     * protection against bots.
     */
    'randomize_name_field_name' => env('HONEYPOT_RANDOMIZE', true),

    /*
     * This field contains the name of a form field that will be used to verify
     * if the form wasn't submitted too quickly. Make sure this name does not
     * collide with a form field that is actually used.
     */
    'valid_from_field_name' => env('HONEYPOT_VALID_FROM', 'valid_from'),

    /*
     * If the form is submitted faster than this amount of seconds
     * the form submission will be considered invalid.
     */
    'amount_of_seconds' => env('HONEYPOT_SECONDS', 1),

    /*
     * This class is responsible for sending a response to requests that
     * are detected as being spammy. By default a blank page is shown.
     *
     * A valid responder is any class that implements
     * `Spatie\Honeypot\SpamResponder\SpamResponder`
     */
    'respond_to_spam_with' => BlankPageResponder::class,

    /*
     * This switch determines if the honeypot protection should be activated.
     */
    'enabled' => env('HONEYPOT_ENABLED', true),
];

用法

首先,您必须将@honeypot Blade指令添加到您希望保护的任何表单中。

<form method="POST" action="{{ action(App\Http\Controllers\ContactFormSubmissionController::class, 'create') }}")>
    @honeypot
    <input name="myField" type="text">
</form>

@honeypot将添加两个字段:my_namemy_time(您可以在配置文件中更改名称)。

接下来,您必须在处理表单提交的路由中使用Spatie\Honeypot\ProtectAgainstSpam中间件。此中间件将拦截任何提交非空值的my_name键的请求。如果它提交的速度比包在my_time中生成的加密时间戳快,它也会拦截请求。

use App\Http\Controllers\ContactFormSubmissionController;
use Spatie\Honeypot\ProtectAgainstSpam;

Route::post([ContactFormSubmissionController::class, 'create'])->middleware(ProtectAgainstSpam::class);

如果您想将Spatie\Honeypot\ProtectAgainstSpam中间件与Laravel的内置认证路由集成,请将Auth::routes();声明用适当的中间件组包装(请确保将@honeypot指令添加到认证表单中)。

use Spatie\Honeypot\ProtectAgainstSpam;

Route::middleware(ProtectAgainstSpam::class)->group(function() {
    Auth::routes();
});

如果您的应用程序有大量由许多不同的控制器处理的表单,您可以选择将其注册为全局中间件。

// inside app\Http\Kernel.php

protected $middleware = [
   // ...
   \Spatie\Honeypot\ProtectAgainstSpam::class,
];

在测试中禁用

默认情况下,任何在1秒内提交的保护表单将被标记为垃圾邮件。当运行端到端测试时,这些测试应该尽可能快地执行,你可能不希望这样。

要禁用代码中的所有蜜罐,可以将enabled配置值设置为false

config()->set('honeypot.enabled', false)

自定义响应

检测到垃圾邮件提交时,默认情况下,该软件包将显示一个空白页面。您可以通过编写自己的SpamResponse并指定其在honeypot配置文件中的完整限定类名,来自定义此行为,该类名为respond_to_spam_with

有效的SpamResponse是任何实现了Spatie\Honeypot\SpamResponder\SpamResponder接口的类。此接口如下所示

namespace Spatie\Honeypot\SpamResponder;

use Closure;
use Illuminate\Http\Request;

interface SpamResponder
{
    public function respond(Request $request, Closure $next);
}

尽管垃圾邮件响应器的主要目的是响应垃圾邮件请求,但您也可以在那里做其他事情。例如,您可以使用$request属性上的属性来确定垃圾邮件的来源(可能所有请求都来自同一个IP),并添加一些逻辑来完全阻止该来源。

如果该软件包错误地将请求判定为垃圾邮件,您可以像在中间件中一样传递$request$next闭包,以生成默认响应。

// in your spam responder
$regularResponse = $next($request)

自定义生成的蜜罐字段

要自定义@honeypot生成的输出,您可以使用以下命令发布honeypot视图

php artisan vendor:publish --provider="Spatie\Honeypot\HoneypotServiceProvider" --tag=views

视图将放置在resources/views/vendor/honeypot/honeypotFormFields.blade.php。这是默认内容

@if($enabled)
    <div id="{{ $nameFieldName }}_wrap" style="display:none;">
        <input name="{{ $nameFieldName }}" type="text" value="" id="my_name">
        <input name="{{ $validFromFieldName }}" type="text" value="{{ $encryptedValidFrom }}">
    </div>
@endif

触发的事件

每当检测到垃圾邮件时,将触发Spatie\Honeypot\SpamDetected事件。它具有$request作为公共属性。

测试

composer test

变更日志

有关最近更改的更多信息,请参阅变更日志

替代方案

如果您需要更强的垃圾邮件保护,请考虑使用Google ReCaptchaAkismet

贡献

请参阅贡献指南以获取详细信息。

安全性

如果您发现任何安全相关的问题,请通过电子邮件freek@spatie.be联系,而不是使用问题跟踪器。

鸣谢

本软件包受到了Maksim Surguy的Honeypot软件包的启发。

许可证

MIT许可证(MIT)。请参阅许可证文件以获取更多信息。