如何保护 laravel api 路由免受外部 GET 请求的影响

Posted

技术标签:

【中文标题】如何保护 laravel api 路由免受外部 GET 请求的影响【英文标题】:How to protect laravel api route from outside GET request 【发布时间】:2022-01-09 10:44:35 【问题描述】:

我正在使用 laravel 构建后端,然后使用 Vue 作为前端。使用 axios 通过 api 调用访问数据。现在我有这个相对简单的任务,但我似乎找不到合适的解决方案。我希望其中一条路线可供 Vue 组件轻松使用而无需登录,但我不希望该路线公开供任何人使用。我说的是 GET 请求,而不是带有 CSRF 令牌的 POST 请求。

让我添加一个示例,这是我的路线:

Route::get('MyFAQS',[\App\Http\Controllers\FaqController::class,'getQuestions']);

还有 vue js:

        axios.get('api/MyFAQS').
        then(response => 
            this.FAQ = response.data;
            console.log(this.FAQ);
        )
        .catch(error=>
            console.log("can not get FAQ: " + error)
        )

在这种情况下,任何人都可以向https://mywebsite.com/api/MyFAQS 发出 GET 请求并在他的网站上使用我的数据,我该如何保护它?

【问题讨论】:

这能回答你的问题吗? How does Google Maps secure their API Key? How to make something similar? @Phil 不确定,我看到了 HTTP_REFERER,我试过了,效果很好,但我认为可以操纵它的推荐并将其发送回我的服务器 没有任何其他形式的身份验证/授权,您就处于“尽力而为”的领域 javascript 是客户端代码。在没有身份验证的情况下,无法在允许客户端访问资源的同时“保护”资源。 在没有某种身份验证的情况下接近保护路由的唯一方法是使用来自源的请求阻止。您可以设置后端代码以拒绝来自所需来源之外的来源(例如前端)的所有请求。这可以在 laravel 中使用中间件轻松完成。 【参考方案1】:

API 令牌是其中一种方法。 试试https://laravel.com/docs/8.x/sanctum 要么 https://laravel.com/docs/8.x/passport

【讨论】:

“保护路由,以便所有传入请求都必须经过身份验证”。我不需要用户登录! 没有用户的身份验证可以通过 laravel 护照客户端凭据授予完成 @SoneyeOluwasina 不幸的是,在 SPA 中保护客户端凭据是不可能的

以上是关于如何保护 laravel api 路由免受外部 GET 请求的影响的主要内容,如果未能解决你的问题,请参考以下文章

如何保护您的 API 免受滥用 - DRF 和 React

Laravel - 保护 API 路由

如何使用 IdentityServer4 保护 API(免受意外调用)?

如何保护您的 API 免受了解您 API 的开发人员的攻击? [关闭]

如何从外部 API 获取 $_POST 数据 - LARAVEL

Laravel 保护列免受不可为空/默认值的批量分配