仅允许来自域的请求并阻止其他来源
allow only requests from domain and block other sources
我想允许某些路由仅响应我的前端网站发出的请求,这意味着出于安全原因阻止其他来源(如邮递员)并仅允许来自前端域的请求。
可能吗?
例如,我有一个网页来检查 link 的动态值并验证 link 上的令牌是否在数据库中,我可以考虑将验证码放在机器人上无法检查所有可能的组合,但它不是 100% 安全的。
Laravel API 节流
如果您的主要问题是机器人获取所有组合,throttling middleware 以及使用验证码将帮助您解决这个问题。
默认情况下,所有 API 路由(在 routes/api.php
中)允许每个 IP 每分钟最多 60 个请求。您可以通过更改 throttle:api
部分在 app/Http/Kernel.php
文件中根据自己的需要修改此金额:
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
例如将其更改为 throttle:30:1
将意味着您将允许每个 ip 每分钟 30 个请求。
如果您只想限制 api 上的某些路由,您可以在别处使用中间件:
Route::get('my-method', MyController::class)->middleware('throttle:30:1');
创建一个限制主机的中间件
如果您想按域精确限制,您正在寻找的可能是自定义 middleware。中间件允许您检查各种请求属性(包括通过 $request->getHost()
请求的主机)并阻止任何控制器或方法。
虽然 Laravel 的默认 TrustHosts
中间件提供全局主机验证,但您可以为特定路径创建自己的自定义中间件,如下所示:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class LocalOnly
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
if($request->getHost() != 'localhost')
{
return response('', 400);
}
return $next($request);
}
}
注意:如果您要创建新的中间件,则需要注册它们。 Laravel 对此有自己的指南 here。
在此示例中,当用于任何路由时,Laravel 将拒绝除 localhost
以外的任何主机(因此即使 127.0.0.1
也会被拒绝)
就我个人而言,我不建议这样做,因为内置的节流是一个更优雅的解决方案,但如果您真的需要这样做,请继续。
您可以通过创建中间件来简单地做到这一点。我添加了一些更有效的方法来添加限制。
1- 创建中间件 ApiBrowserRestricationMiddleware
2- 添加这个 \App\Http\Middleware\ApiBrowserRestricationMiddleware::class
在
App\Http\Kernel
$middleware
数组
3-在ApiBrowserRestricationMiddleware
中添加代码
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class ApiBrowserRestricationMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
if(in_array($request->getHost(), ['127.0.0.1']) == false)
{
return response('', 400);
}
return $next($request);
}
}
我想允许某些路由仅响应我的前端网站发出的请求,这意味着出于安全原因阻止其他来源(如邮递员)并仅允许来自前端域的请求。
可能吗?
例如,我有一个网页来检查 link 的动态值并验证 link 上的令牌是否在数据库中,我可以考虑将验证码放在机器人上无法检查所有可能的组合,但它不是 100% 安全的。
Laravel API 节流
如果您的主要问题是机器人获取所有组合,throttling middleware 以及使用验证码将帮助您解决这个问题。
默认情况下,所有 API 路由(在 routes/api.php
中)允许每个 IP 每分钟最多 60 个请求。您可以通过更改 throttle:api
部分在 app/Http/Kernel.php
文件中根据自己的需要修改此金额:
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
例如将其更改为 throttle:30:1
将意味着您将允许每个 ip 每分钟 30 个请求。
如果您只想限制 api 上的某些路由,您可以在别处使用中间件:
Route::get('my-method', MyController::class)->middleware('throttle:30:1');
创建一个限制主机的中间件
如果您想按域精确限制,您正在寻找的可能是自定义 middleware。中间件允许您检查各种请求属性(包括通过 $request->getHost()
请求的主机)并阻止任何控制器或方法。
虽然 Laravel 的默认 TrustHosts
中间件提供全局主机验证,但您可以为特定路径创建自己的自定义中间件,如下所示:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class LocalOnly
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
if($request->getHost() != 'localhost')
{
return response('', 400);
}
return $next($request);
}
}
注意:如果您要创建新的中间件,则需要注册它们。 Laravel 对此有自己的指南 here。
在此示例中,当用于任何路由时,Laravel 将拒绝除 localhost
以外的任何主机(因此即使 127.0.0.1
也会被拒绝)
就我个人而言,我不建议这样做,因为内置的节流是一个更优雅的解决方案,但如果您真的需要这样做,请继续。
您可以通过创建中间件来简单地做到这一点。我添加了一些更有效的方法来添加限制。
1- 创建中间件 ApiBrowserRestricationMiddleware
2- 添加这个 \App\Http\Middleware\ApiBrowserRestricationMiddleware::class
在
App\Http\Kernel
$middleware
数组
3-在ApiBrowserRestricationMiddleware
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class ApiBrowserRestricationMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
if(in_array($request->getHost(), ['127.0.0.1']) == false)
{
return response('', 400);
}
return $next($request);
}
}