我有使用访问令牌的 REST api,该令牌在标头或作为 url 查询中发送。我根本不使用cookies。
我仍然容易受到 CSRF 攻击吗?我知道我会使用 cookie,因为其他选项卡可以发送请求并且 cookie 也会发送,但在我的情况下,根本不会发送 Headers/UrlParam。
我有使用访问令牌的 REST api,该令牌在标头或作为 url 查询中发送。我根本不使用cookies。
我仍然容易受到 CSRF 攻击吗?我知道我会使用 cookie,因为其他选项卡可以发送请求并且 cookie 也会发送,但在我的情况下,根本不会发送 Headers/UrlParam。
不,在那种情况下,你并不容易受到攻击。
原因正如您所解释的那样 - 第三方站点可能会向您的站点生成请求,但不会附加身份验证详细信息。
如果您使用 HTTP Basic 或 HTTP Digest 身份验证,CSRF 仍然是可能的。
这样做的原因是浏览器“本机”实现这些协议,这意味着如果浏览器知道凭据,浏览器将自动插入域的 HTTP Basic/Digest 凭据。
如果您使用其他形式的身份验证而不使用 cookie,那么 CSRF 是不可能的。
从您的问题来看,尚不清楚您是否脆弱。令牌是固定的还是加密强的随机生成令牌?如果它是固定的,它是没有价值的。
你在使用 SSL 吗?如果不是,您的令牌可能会被嗅探和窃取 - 强烈建议您使用 SSL。
另请注意,不建议在 url 中传递令牌。URL 是敏感的,因为它们需要在许多地方登录,例如浏览器历史记录、网络设备等... https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet#Disclosure_of_Token_in_URL
您如何在服务器端验证令牌是否有效?你把它保存在服务器会话中吗?通常 REST API 被设计为无状态的——这意味着不应保留任何会话。如果您想遵守此规则,您应该在仅 http 的 cookie 中创建令牌,并在每次 API 调用时将 cookie 值作为请求的一部分发送。然后,您的 API 应检查 cookie 值是否与请求中的令牌相同。攻击者无法读取 cookie,因此无法在请求中发送正确的令牌。
这是一个很好的博客:http: //blog.codinghorror.com/preventing-csrf-and-xsrf-attacks/
这似乎是防止 CSRF 攻击的正确方法。虽然,您可能希望在每个请求上生成一个新令牌并使之前使用的令牌无效。