我认为CSRF的主要目标是确认发出请求的客户端是我们预期的客户端。
常见的解决方法是:
1.服务器生成随机 CSRF Token 2.服务器在cookie中设置CSRF token 3.服务器在生成表单时将CSRF token注入到表单中,或者将CSRF token传递给javascript,并让javascript将CSRF token注入XMLHTTPRequests头部。 4.当收到请求时,通过检查cookie中的CSRF token与头部/表单值中的CSRF token是否匹配来验证请求是否合法。
我认为服务器为(3)(1)生成CSRF token非常有意义,但我无法想出为什么在(3)(2)中这样做是必要的。
相反,如果客户端是纯javascript,我认为以下操作是安全的:
1.Javascript生成随机CSRF token 2.Javascript在cookie中设置CSRF token 3.Javascript在XMLHTTPRequest中传递CSRF token的头部 4.服务器检查头部和cookie中的CSRF token是否匹配
我的理解是,攻击者无法执行3和4,因此这也足以阻止攻击。这正确吗?
如果是安全的,我们甚至需要执行步骤(1)和(2)吗? 如果同源策略已正确配置,这是否也是安全的?
1. Javascript在XMLHTTPRequest中设置“CSRF-Safe: true”头部 2. 服务器检查头部CSRF-Safe是否存在并设置为“true”
常见的解决方法是:
1.服务器生成随机 CSRF Token 2.服务器在cookie中设置CSRF token 3.服务器在生成表单时将CSRF token注入到表单中,或者将CSRF token传递给javascript,并让javascript将CSRF token注入XMLHTTPRequests头部。 4.当收到请求时,通过检查cookie中的CSRF token与头部/表单值中的CSRF token是否匹配来验证请求是否合法。
我认为服务器为(3)(1)生成CSRF token非常有意义,但我无法想出为什么在(3)(2)中这样做是必要的。
相反,如果客户端是纯javascript,我认为以下操作是安全的:
1.Javascript生成随机CSRF token 2.Javascript在cookie中设置CSRF token 3.Javascript在XMLHTTPRequest中传递CSRF token的头部 4.服务器检查头部和cookie中的CSRF token是否匹配
我的理解是,攻击者无法执行3和4,因此这也足以阻止攻击。这正确吗?
如果是安全的,我们甚至需要执行步骤(1)和(2)吗? 如果同源策略已正确配置,这是否也是安全的?
1. Javascript在XMLHTTPRequest中设置“CSRF-Safe: true”头部 2. 服务器检查头部CSRF-Safe是否存在并设置为“true”