我一直在使用PHP进行自己的CSRF保护。根据我所了解的,我决定使用cookie来实现我的保护,但是我有些困惑,不确定我的方法是否安全防范CSRF攻击。
我的方法如下:
1. 用户发送登录请求。 2. 服务器检查是否设置了CSRF令牌,如果没有,则创建一个并将其存储在会话中,并创建一个带有令牌的Cookie。 3. 通过检查POST请求中是否存在CSRF令牌来验证CSRF令牌,如果不存在,则检查$_COOKIE中的令牌。 4. 如果令牌无效,则返回消息......
我决定使用cookie来存储令牌,因为这样对于Ajax请求将起作用,我不必每次使用Ajax POST时都要包含它。
我困惑的是,攻击者难道不可以只是发送一个请求;POST或GET,因为cookie已经存在,它就会随着请求被发送,因此每次都会发送令牌与浏览器一起发送,从而成为有效请求吗?
我的方法如下:
1. 用户发送登录请求。 2. 服务器检查是否设置了CSRF令牌,如果没有,则创建一个并将其存储在会话中,并创建一个带有令牌的Cookie。 3. 通过检查POST请求中是否存在CSRF令牌来验证CSRF令牌,如果不存在,则检查$_COOKIE中的令牌。 4. 如果令牌无效,则返回消息......
我决定使用cookie来存储令牌,因为这样对于Ajax请求将起作用,我不必每次使用Ajax POST时都要包含它。
我困惑的是,攻击者难道不可以只是发送一个请求;POST或GET,因为cookie已经存在,它就会随着请求被发送,因此每次都会发送令牌与浏览器一起发送,从而成为有效请求吗?
Access-Control-Allow-Origin
头是否设置完全取决于开发人员的决定。JSONP请求可能是一个例外。 - apokryfosPOST
/GET
和脚本加载(jsonp)等请求(如果这符合规范,则无关紧要)。 如果所有浏览器都尊重CORS,并且如果跨域表单POST
不被规范允许,则CSRF将不相关。 但由于跨域表单POST
是可能的,因此需要CSRF令牌,并且仅当它们未存储在客户端的cookie中时才具有任何额外的会话cookie安全性。 - t.niese[...]根据本规范之外生成的简单跨源请求(例如使用GET或POST进行的跨源表单提交或由脚本元素引起的跨源GET请求)通常包括用户凭据,因此符合本规范的资源必须始终准备好接受带有凭据的简单跨源请求。[...]
(4 安全注意事项) - t.niese