umod/defender

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

1.0.1 2021-04-08 07:45 UTC

This package is auto-updated.

Last update: 2024-09-08 20:00:02 UTC


README

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

简介

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

此包随机化输入名称,使机器人无法做出有根据的猜测。示例

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

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

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

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

安装

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

Composer

通过打开 composer.json 文件,并通过 composer 拉取此包,在 require

"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 许可证条款分发。