我看过的大多数框架都会在表单中插入一个隐藏的输入元素,其值为CSRF令牌。这是为了防止用户Bob登录我的网站,然后转到http://badsite.com嵌入img标签或JS,告诉我的网站使用Bob仍然登录的会话执行请求。
我没有得到的是什么阻止了来自AJAX的badsite.com上的JS在我的网站上请求带有表单的URL,从隐藏的输入元素中复制CSRF令牌,然后使用该表单将AJAX发布到我的站点有效的CSRF令牌?
在我看来,您希望使用JS在运行时将CSRF令牌插入到表单中,从cookie中提取值(badsite.com无法访问)。但是,我没有听说过这种方法,并且有很多框架使用CSRF令牌进行简单的隐藏输入,我想知道我的解决方案是否过度设计并且我错过了使隐藏输入方法安全的部分原因
任何人都可以提供一些清晰度吗?谢谢!
答案 0 :(得分:4)
什么阻止了来自AJAX的badsite.com上的JS请求在我的网站上使用表单的URL
Same Origin Policy(除非你用过于自由的CORS标题来颠覆它)。未经该主机许可,站点上运行的JavaScript无法从托管在其他主机上的站点读取数据。
SOP有一些变通方法,但它们都需要主机的合作才能读取数据(JSON-P,CORS),或者不传递任何标识特定用户的数据(所以无法访问任何需要授权的内容。)