melvintehu/laravel-spam-protection

使用随机输入名称/蜜罐来抵御垃圾邮件机器人。感谢thomastkim。

1.0.0 2015-10-11 06:35 UTC

This package is not auto-updated.

Last update: 2024-09-23 22:44:46 UTC


README

此包通过使用随机输入名称和蜜罐来帮助您抵御垃圾邮件机器人。

简介

垃圾邮件是网络的一个大问题。表单填写机器人会读取展示给它们的表单并自动填写字段。另一种类型的机器人会记录POST数据并将其回放到提交URL。此包可以帮助您以最小的努力抵御这些机器人。

该包会随机化输入名称,这样机器人就不能做出有根据的猜测。示例

Before: <input type="text" name="username">

After: <input type="text" name="neeS9dJDeQCbNvN3lgyxIkdQ6R1l2GHEEnmt">

此外,此包允许您添加随机数量的隐藏输入,称为“蜜罐”(或诱饵)。您的普通用户永远不会看到这些,但机器人会。机器人倾向于填写所有输入,因此您可以轻松拒绝任何填写了“诱饵”输入的表单。

通过这种方式,机器人将难以解析您的表单、记录POST数据并垃圾邮件您的网站。

安装

要安装此包,只需按照以下快速简单的步骤进行。

Composer

通过打开 composer.json 文件,并在 require 中添加此包来通过composer获取此包。

"kim/defender": "~1.0"

之后,运行 composer updatecomposer install

提供者和别名

接下来,打开 config/app.php 并将其添加到您的提供者数组中

Kim\Defender\DefenderServiceProvider::class

并将其添加到您的别名数组中

'Defender' => Kim\Defender\DefenderFacade::class

使用

创建输入字段

通常,这是创建用户名输入字段的常规方法

<input type="text" name="username">

然而,我们想要随机化名称,为此,我们使用Defender外观

<input type="text" name="{{ Defender::username() }}">

这里是一些其他常见的输入(如电子邮件和密码),这些输入都是该包内置的。

<input type="email" name="{{ Defender::email() }}">
<input type="password" name="{{ Defender::password() }}">

您还可以通过使用 get 方法并传递输入的名称来轻松创建自己的自定义类型。

<input type="text" name="{{ Defender::get('custom') }}">
<textarea name="{{ Defender::get('message') }}"></textarea>
<input type="date" name="{{ Defender::get('some_date_field') }}">

话虽如此,我相信很多人都在想知道如果名称都是随机的话,如何检索值。这很简单。在您的控制器中,您可以使用相同的方法轻松检索这些值。

示例控制器

// Import it at the top
use Defender;


public function example(Request $request)
{
	$email = $request->input( Defender::email() );
	$username = $request->input( Defender::username() );

	$custom = $request->input( Defender::get('custom') );
}

蜜罐

这很好,但要使其更加坚固,我们需要一些蜜罐。这些是编辑字段,对人类不可见。如果机器人填写了它们,我们就知道要拒绝提交。我们可以以多种方式创建蜜罐。

最基本的方法是使用 baitToken 方法。这简单地创建一个随机的令牌作为诱饵。然而,它并不隐藏字段。我建议使用JavaScript或CSS来隐藏这个输入。

<input type="text" name="{{ Defender::baitToken() }}">
<!-- Output: <input type="text" name="some_random_string"> -->

baitField 方法创建一个随机的输入类型(文本、电子邮件、密码、单选按钮、复选框等)。还会应用随机样式来隐藏这些输入。

{{ Defender::baitField() }}
<!-- Output: <input type="random_type" name="some_random_string" style="random_styling_that_hides_this"> -->

最后,我们有 baitFields 方法。这种方法不仅创建一个随机的输入字段,而且还创建一个随机数量的输入字段。

{{ Defender::baitFields() }}
<!-- Output x1 to x5: <input type="random_type" name="some_random_string" style="random_styling_that_hides_this"> -->

baitFields 方法还接受一个整型参数。例如,Defender::baitFields(20) 将输出1到20个隐藏诱饵。

验证与拒绝

您可以使用相同的方法来验证字段。

// Import the Defender facade
use Defender;

// Add to the rules
public function rules()
{
    return [
        Defender::username() => 'required'
    ];
}

关于拒绝蜜罐,最简单的方法是添加软件包的DefendAgainstSpam中间件。要这样做,请打开app/Http/Kernel.php文件,并将中间件添加到$middleware$routeMiddleware数组中。如果您将其添加到$middleware数组中,则该软件包将在每个请求中检查蜜罐。这是处理它的最简单方法。然而,如果您想将中间件应用于特定路由,则需要将其添加到您的$routeMiddleware数组中。以下两个示例都有所展示。

// Add here if you want to automatically check all routes
protected $middleware = [
	...
	\Kim\Defender\Middleware\DefendAgainstSpam::class
];

// Add here if you want to manually check specific routes
protected $routeMiddleware = [
	'defend' => \Kim\Defender\Middleware\DefendAgainstSpam::class
];

如果您将其添加到$routeMiddleware,现在您需要手动检查特定路由,因此请更改您的路由文件以反映这一点。

Route::get('/example', [
	'as' => 'example'
	'middleware' => 'defend',
	'uses' => 'ExampleController@store'
]);

如果中间件捕获到潜在的垃圾邮件发送者,它将抛出InvalidFormException。您可以在app/Exceptions/Handler.php文件中捕获此异常并执行任何您想做的事情。

public function render($request, Exception $e)
{
    if ($e instanceof \Kim\Defender\Exceptions\InvalidFormException) {
        // This example just redirect them back home. However, you probably
        // also want to do other things like: log the time, ip, etc.
        return redirect('/');
    }

    return parent::render($request, $e);
}

最后,对于那些不想使用中间件的人来说,您可以使用自定义验证规则'reject'。

public function rules()
{
    $rules = [
        // Your rules..
    ];

    // We reject the bait here
    foreach (Defender::bait() as $bait) {
        $rules[$bait] = 'reject';
    }

    return $rules;
}

许可证

本软件包是免费软件,根据MIT许可证条款分发。