我就是这样做的:
$ip = $request->ip();
if (Cache::has('banned_ip_' . $ip)) {
return response()->json([
'message' => 'Access blocked',
'reason' => 'You have been banned from accessing this service.'
], Response::HTTP_FORBIDDEN);
}
if (
str_contains($code, 'admin') ||
str_contains($code, 'env') ||
str_contains($code, 'config') ||
str_contains($code, 'php') ||
str_contains($code, 'service') ||
str_contains($code, 'setting') ||
str_contains($code, 'server')
) {
Log::channel('shortLink')->warning('Blocked access for code: ' . $code . ' from IP: ' . $ip);
Cache::put('banned_ip_' . $ip, true, now()->addDay());
return response()->json([
'message' => 'Access blocked',
'reason' => 'Forbidden code detected, your IP has been banned.'
], Response::HTTP_FORBIDDEN);
}
我正在寻找更好的方法来做到这一点,但我不知道该怎么做。
这段代码位于中间件中。
如果有的话,我希望有更好的方法。
您可以使用 Laravel Firewall 这个包,而不是从头开始创建一个。它支持更多功能,包括:
用法示例 中间件已经定义,因此您只需将它们添加到您的路由中即可。 firewall.all 中间件应用配置文件的 all_middleware 数组中可用的所有中间件:
Route::group(['middleware' => 'firewall.all'], function () {
Route::get('/', 'HomeController@index');
});
您还可以在每个路由中应用每个中间件。例如,仅允许列入白名单的 IP 访问管理区域:
Route::group(['middleware' => 'firewall.whitelist'], function () {
Route::get('/admin', 'AdminController@index');
});