JavaScript客户端设置CSRF令牌是否安全?

3
我认为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
你认为攻击者为什么不能执行1到4及以上的操作?大多数攻击者甚至不会使用你的代码,而是会针对漏洞制定请求,例如在你的情况下,只需将头和Cookie设置为一些随机值以绕过检查。 - Lawrence Cherone
@LawrenceCherone,但如果他们这样做了,他们不能生成已知的代码并将其用于(1)和(2)吗? - ChiefTwoPencils
@LawrenceCherone 我有独特的会话cookie来授权请求。我认为CSRF只是用于验证客户端,当客户端是浏览器时。据我所知,移动应用程序代码不需要进行CSRF检查。 - Colin
@LawrenceCherone,我想我的问题让我意识到我们在同一页面上。我只是在回应你未编辑的关于(1)和(2)的评论。 - ChiefTwoPencils
CSRF的作用是防止已登录用户在不知情的情况下执行某些操作,无论是通过中间人重放攻击还是一些成功绕过安全措施的XSS代码。 - Lawrence Cherone
@LawrenceCherone我认为XSS和CSRF是不同类型的攻击,而且我不指望CSRF令牌能够防止XSS攻击。https://en.wikipedia.org/wiki/Cross-site_request_forgery https://en.wikipedia.org/wiki/Cross-site_scripting - 虽然可以肯定的是,服务器生成的CSRF令牌也可能保护免受我没有想到的某些类别的XSS漏洞的影响。你知道吗? - Colin
1个回答

2
是的,在CORS和同源策略存在的情况下,这两种简化方法都应该是安全的。事实上,只要验证内容类型,您甚至不需要CSRF-Safe: true头。
维基百科确认

如果数据以任何其他格式(JSON、XML)发送,则使用XMLHttpRequest发出POST请求并通过SOP和CORS防止CSRF攻击是一种标准方法;还有一种技术可以使用ENCTYPE属性从简单的HTML表单中发送任意内容;这样的伪造请求可以通过text/plain内容类型与合法请求区分开来,但如果服务器未强制执行此规则,则可能会执行CSRF[12][13]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接