关于跨域请求伪造攻击,十八摸这个文章写的简单易懂
https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/打开本站每一个话题页面都有一个独立 csrfToken,并在那些写数据的处理函数中附带这个 token。
但是这个设计有个问题,就是 token 会快速过期。比如打开 A 话题页面,然后打开 B 话题页面,回到 A 页面,给某个人发送感谢,一定会失败,但是 thankReply 函数没有正确处理返回数据,会显示感谢发送成功。
同样的问题会出现在 感谢回复,感谢主题,给主题投票,忽略主题,收藏主题,删除通知。
在遵循 csrfToken 设计初衷的情况下,可以有一些修正方法。
网站方面:
1. 每个页面中使用 localStorage 存储 csrfToken,对所有写数据的请求,放弃硬编码 token,也不读取全局变量,而是从 localStorage 中读取,此时网站的所有打开页面共享一个最新的 token,失效问题解决。
2. 因为写数据相比读数据是个低频行为,所以可以设立单独的 updateToken 方法,每次写数据操作,先 ajax 一个 token,服务器根据用户当前是否合法登录,决定是否返回有效 token。获取到 token 后,附加到写数据函数中。
用户方面:
V 站的各种设计,其实累积了一些问题,好像长期没有修正。作为用户,可以自己动手改良体验。
1. 对应上面的方法 1,自己写脚本 localStorage.csrfToken = csrfToken,然后写几个函数封装上面的 6 个系统函数,然后埋到对应位置。
2. 对应上面的方法 2,自己写 updateToken 方法,ajax 最新的 token,然后写几个函数封装上面的 6 个系统函数,然后埋到对应位置。
方法 2 的好处是,如果 token 的过期时间较短,即使 localStorage.csrfToken = csrfToken,对于那些打开较长时间的页面(一天没看完的主题,第二天接着看),也可能面临过期问题。每次更新就没有问题。
各位发布了 V2EX 增强脚本的同学,如果看到了这个帖子,可以考虑加进这个特性。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/382940
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.