我们首先统一一下口径: 站点 A:被攻击的网站 站点 B:伪造请求的网站
一般网站的防御方法是: 判断请求中的 token 和 cookie 中的 token 是否相同,相同则表示请求发起者和会话用户是同一个人。
这种防御方法可行的原因是: 站点 B 无法获取到站点 A 的 cookie,所以无法在请求中添加 token。
但,我们假设站点 B 知道站点 A 的某个页面表单里有隐藏的 token 字段,那么,站点 B 在自己的页面中写一个隐藏的 iframe 去请求这个页面。(这里有一个问题,iframe 会创建新的会话吗?但不管会不会,都有如下可能)
iframe 不会生成新的会话。那么对于用户而言,假设用户在访问站点 A 后没有关闭站点又去访问了站点 B,那么站点 B 中的 iframe 和站点 A 属于同一个会话,也就是说他们的 token 相同。这个时候站点 B 通过预先写好的脚本去获取到 iframe 中的 token,然后在伪造的请求中加入这个 token,能否成功?
iframe 会生成新的会话。那也就是说站点 B 的 iframe 中的 token 和站点 A 的 token 值是不相同的,但是可以使用以下方法去伪造请求:站点 B 不是直接在页面中添加伪造请求,而是在 iframe 里去添加伪造请求,由于 iframe 中是站点 A 的会话,所以请求会带着站点 A 的 cookie 一起发出去,由于 iframe 和站点 A 共用一套 cookie (因为同域),所以就成功盗用了用户的身份。这种方法可行吗?
看来我描述的让有些v友产生了误解,我修改下上述验证:
经过验证,iframe 并不会产生新的会话,而是会沿用未关闭的站点 A 的会话。
也就是说,iframe 中 表单的 token 字段 已经可见,关键在于脚本是否能够获取到。
     1 
                    
                    40huo      2018-02-05 00:51:06 +08:00 via Android 
                    
                    你说的这个应该在 xss 和同源策略的范围讨论,和 csrf 已经关系不大了 
                 | 
            
     2 
                    
                    fy      2018-02-05 00:53:24 +08:00 
                    
                    > 这里有一个问题,iframe 会创建新的会话吗? 
                会,但是并不能跨域进行对 iframe 的任何操作。所以取不到 token。  | 
            
     3 
                    
                    lxy      2018-02-05 01:06:26 +08:00 
                    
                    因为同源策略,所以你无法获取 token 
                >Scripts trying to access a frame's content are subject to the same-origin policy, and cannot access most of the properties in the other window object if it was loaded from a different domain. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe  | 
            
     4 
                    
                    yyfearth      2018-02-05 04:03:58 +08:00 via iPhone 
                    
                    这个 首先你就没办法访问跨域的 iframe 所以你说的方法从根本上就不可能 
                 | 
            
     5 
                    
                    alvinbone88      2018-02-05 08:18:00 +08:00    一般带有 CSRF 防御的页面通常会在 HTTP 的响应头里加一个 X-Frame-Options 来阻止页面在 iframe 中加载,所以把页面嵌在 iframe 里根本不可能,得到的结果就是一片空白 
                另外提醒一下,在页面中加<meta http-equiv="X-Frame-Options" content="deny">会被部分浏览器忽略掉(比如 IE )  | 
            
     6 
                    
                    zjsxwc      2018-02-05 08:26:46 +08:00 
                    
                    ``` 
                一般网站的防御方法是: 判断请求中的 token 和 cookie 中的 token 是否相同,相同则表示请求发起者和会话用户是同一个人。 ``` 楼主你一开始就搞错了吧,不是判断 cookie 的 token 而是服务器端 session 里的 token  | 
            
     7 
                    
                    xvrzhao   OP  | 
            
     8 
                    
                    MeteorCat      2018-02-05 08:57:21 +08:00 via Android    首先,其实就目前来说所有语言的 Web 现代化框架都带有对这种方法的屏蔽,基本上都是内部页面表单会生成一个 hidden 的字段,确保这次提交是请求服务之后返回下来表单(虽然很多人都不用这个,因为基本上除非你直接网页就被挂马,否则内嵌而已 iframe 来提交表单基本上可以认定为小概率事件不做考虑);其次就是如何内嵌 iframe 到页面做请求?楼主有真实案例?纸上得来终觉浅,绝知此事要躬行 
                 | 
            
     9 
                    
                    oott123      2018-02-05 09:20:23 +08:00 via Android    可见只是你可见,对脚本不可见,如果脚本都可见,那就是 xss 了… 
                另外通过 iframe 攻击的有跨站框架攻击( xfs ),也有对应的防御方法。  | 
            
     10 
                    
                    RadishWind      2018-02-05 09:38:04 +08:00 
                    
                    有同源策略的 不然太不安全了 
                 | 
            
     11 
                    
                    ai277014717      2018-02-05 10:04:59 +08:00 
                    
                    不错,昨天还在看 express 官方中间件 csrf 的代码,确实只要保证 token 喝 cookie 中的 token 一致就可以了。 
                就是想办法拿到 cookie 就可以了  | 
            
     12 
                    
                    binux      2018-02-05 10:22:39 +08:00 
                    
                    你都用上插件了,还费那个劲搞什么 iframe 啊,A 的 cookie 你不是想读就读,想写就写吗。 
                说白了就是,想得太多,多读点书。  | 
            
     13 
                    
                    liuguang      2018-02-05 10:22:41 +08:00 
                    
                    你拿不到别人的 cookie 的,自然也拿不到 Token,你觉得伪造一个 Token 会有效吗、、、 
                 | 
            
     14 
                    
                    LeungJZ      2018-02-05 10:36:16 +08:00 
                    
                    楼主不是前端吧。 
                怎么可能可以获取一个跨域 iframe 里面的东西?  | 
            
     15 
                    
                    AV1      2018-02-05 11:30:18 +08:00 
                    
                    1、iframe 也必须遵循同源策略的,B 是无法获取 iframe 里 A 的 cookie,浏览器会简单粗暴地拒绝你的脚本。 
                2、如果用上扩展了,都可以监听用户的键盘、鼠标操作了,都可以窜改页面了,比绕个弯子搞 iframe 的更好的方法多了去了。  | 
            
     16 
                    
                    johnnie502      2018-02-05 12:50:38 +08:00 
                    
                    扩展也是有作用域的,你搞个作用域是所有网站的,还不是随便什么域都可以看。这种东西不是那么容易被破的,总想搞个大新闻 
                 | 
            
     17 
                    
                    virusdefender      2018-02-05 13:34:32 +08:00 
                    
                    思而不学则殆 / 纸上得来终觉浅 
                楼主不测试就发帖子啊  | 
            
     18 
                    
                    wanguorui123      2018-02-05 17:08:34 +08:00 
                    
                    除非浏览器允许跨域访问或者浏览器漏洞,否则就不可能 
                 | 
            
     20 
                    
                    Telegram      2018-02-06 08:17:58 +08:00 via iPhone 
                    
                    跨域知道不? A 站没设置信任 B,B 根本就取不到 A 的数据,只要是个正常的浏览器,都不让你读。 
                 |