我目前正在努力解决如何防止 CSRF 的问题。
我的第一个解决方案是使用随处建议的令牌。这当然可以解决这个问题:
<img src="http://api.example.com/me/delete">
但我无法理解的是。
GET http://api.example.com/me/delete
确实会失败,因为该请求没有附带有效的令牌,但是是什么阻止了攻击者执行上述操作,而只是执行以下操作
GET http://api.example.com/me/token/generate
// parse the response
GET http://api.example.com/me/delete?token=...
有效令牌已随请求传递,我的用户现在已被删除...
我的 REST API 允许任何请求通过。
header("Access-Control-Allow-Origin: " . $_SERVER["HTTP_ORIGIN"]);
我“需要”的原因是,我不仅通过表单和 JavaScript 在域本身上使用 REST API。但是我在 C++ 中使用 cURL 来做请求。
如果在这种情况下令牌不是“安全”的解决方案,那么更安全/更好的解决方案会/可能是什么?
更进一步,像 Spotify 这样的东西在他们都有自己的“Web API”和音乐软件本身的同时还能做什么?
另外,我知道这有点牵强,但是是否可以允许任何东西访问我的 API,但具有每个来源的身份验证?
因此,如果http://example.com已“登录”API,并不意味着http://some-other-website.com已登录(或在使用 cURL 请求时更进一步)。
我知道这很牵强,因为“解决方案”是检查原始标头,但这可能会被欺骗。