作者:Rain雨露Dew | 来源:互联网 | 2022-12-07 11:09
我正在使用CakePHP 3.x文档开发API。为了开发此API,我使用了他们的官方文档:https : //book.cakephp.org/3.0/en/development/rest.html
当我尝试使用url http://localhost/healthcare_portal/eapi/applicants/index.json上的GET请求访问我的api时,我得到了预期的json结果
{
"applicants": [
{
"applicant_id": 1,
"name": "Manender"
},
{
"applicant_id": 2,
"name": "mayank"
}
]
}
但是,当我在同一URL http://localhost/healthcare_portal/eapi/applicants/index.json上使用POST请求访问我的api时,出现CSRF不匹配令牌错误。在这种情况下,来自API的响应为
{
"message": "Missing CSRF token COOKIE",
"url": "/applicants/index.json",
"code": 403,
"file": "/opt/lampp/htdocs/healthcare_portal/eapi/vendor/cakephp/cakephp/src/Http/Middleware/CsrfProtectionMiddleware.php",
"line": 191
}
我尝试了其他替代方法
$input = (array) $this->request->input('json_decode', true);
在控制器的操作中,但这是我在发布请求时收到相同的错误。如果有人遇到同样的问题,请帮助我取得突破。
1> ndm..:
如3.6版本中发布请求中CSRF令牌不匹配中所述,默认应用模板最近默认情况下启用了CSRF保护中间件,要求CSRF令牌和COOKIE与非GET
请求一起发送。
您的API最有可能需要某种形式的身份验证,并且如果身份验证不依赖COOKIE或(HTTP)基本身份验证,或者浏览器/客户端将自动通过HTTP请求发送/执行的任何其他形式的身份验证,那么您不需要CSRF保护,因为CSRF是不可能的。
如果你没有需要CSRF保护
如果您的API确实不需要CSRF保护,则可以禁用它,例如,通过使用自定义中间件处理程序来检查请求URL或路由,并有条件地应用CSRF中间件,或者通过在路由范围内应用中间件,因此您可以排除API范围,请参阅Cakephp 3.5.6为控制器禁用CSRF中间件。
如果您确实需要CSRF保护
如果您的API使用的身份验证形式很容易出现CSRF,那么您应该找出一种方法来提供COOKIE(中间件会根据GET
请求自动设置COOKIE )和CSRF令牌(它们在请求对象上都可以使用$request->getParam('_csrfToken')
)提供给您的客户,以便他们可以与他们的请求一起发送。
也可以看看
食谱>中间件>跨站点请求伪造(CSRF)中间件
https://security.stackexchange.com/questions/166724/should-i-use-csrf-protection-on-rest-api-endpoints