melvintehu / laravel-spam-protection
使用随机输入名称/蜜罐来抵御垃圾邮件机器人。感谢thomastkim。
Requires
- php: >=5.4.0
- illuminate/session: ~5.0
- illuminate/support: ~5.0
- illuminate/validation: ~5.0
- illuminate/view: ~5.0
Requires (Dev)
- mockery/mockery: dev-master
- phpunit/phpunit: ~4.0
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 update
或 composer 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许可证条款分发。