V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
xilixjd
V2EX  ›  问与答

问个问题,浏览器既然没有解决 CSRF 的问题,那为什么要有跨域限制?

  •  
  •   xilixjd · 2017-08-21 10:39:11 +08:00 · 4787 次点击
    这是一个创建于 2669 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看了网上的解释,都说若没有跨域限制,做一个 iframe 是你需要登录的网站,外层是恶意代码网站,然后你的账号密码他能得到,并且通过 ajax 发送到他的服务器。

    但即使有跨域限制,有了默认跨域的 img 或者 script 标签,我还是可以把数据发送到我的服务器。那跨域有啥用?

    另外想问 CSRF 对 POST 请求怎么处理,因为我能想到的 CSRF 攻击,就是建一个没有跨域限制的 img 或者 script 标签发送 GET 请求,那么 POST 请求是不是防范大部分的 CSRF 攻击?

    13 条回复    2017-08-22 03:15:40 +08:00
    weyou
        1
    weyou  
       2017-08-21 10:43:44 +08:00 via Android
    从另一个域发起 post,比如 form 的 submit
    xilixjd
        2
    xilixjd  
    OP
       2017-08-21 10:49:12 +08:00
    @weyou 那这样不是被跨域限制给挡住了吗
    jugelizi
        3
    jugelizi  
       2017-08-21 10:53:58 +08:00
    跨域不是说不能发起请求 而是浏览器根据服务器的响应阻断了数据返回
    实际上那个请求对方已经收到了

    post 和 csrf 无关 建议在看看书
    weyou
        4
    weyou  
       2017-08-21 10:54:20 +08:00 via Android
    @xilixjd form 提交没有跨域限制
    TakWolf
        5
    TakWolf  
       2017-08-21 10:55:13 +08:00
    CSRF 防范的并不是别人把你的数据发到他自己的服务器,而是防止别人调用你的接口
    TakWolf
        6
    TakWolf  
       2017-08-21 10:56:20 +08:00
    xilixjd
        7
    xilixjd  
    OP
       2017-08-21 11:03:05 +08:00
    @jugelizi OK 明白了,但是跨域究竟有什么用还是不知道
    xilixjd
        8
    xilixjd  
    OP
       2017-08-21 11:08:16 +08:00
    @TakWolf 好的
    jugelizi
        9
    jugelizi  
       2017-08-21 11:10:07 +08:00
    @xilixjd。。。比如你是管理员 登录某系统 可以点击删除按钮把一篇文章删除,那么我可以写个 js 或者其他方式实现请求该地址 你访问他的页面时浏览器就会执行这个请求 就相对于伪造了你的操作去删除
    xilixjd
        10
    xilixjd  
    OP
       2017-08-21 11:13:44 +08:00
    @jugelizi CSRF 不就是干这个事的吗,现在有了跨域限制,但是还是防范不了?
    lianyue
        11
    lianyue  
       2017-08-21 11:25:25 +08:00
    没 CORS 跨域取数据几乎只能用 GET 方法 JSONP 不能自定义 header 头

    有了 CORS 任何方法 自定义 header 头 都能用
    wangym5106
        12
    wangym5106  
       2017-08-21 14:11:49 +08:00
    同源策略是为了防止一个源上的脚本使用其他源上的资源,比如读取其他源上的页面内容。

    CSRF 攻击只是让浏览器发出请求,并没有使用其它源上的资源,所以也并不受同源策略的影响。
    SoloCompany
        13
    SoloCompany  
       2017-08-22 03:15:40 +08:00
    CSRF 和 CORS 这两个并不是同一回事请不要弄混了

    网站的 CSRF 保护是网站的事情,浏览器并不能帮你解决欺骗点击这类 CSRF 攻击,必须网站自己去解决

    而 CORS 是浏览器的 XHR 规范之一,实际需要保护的,是第三方网站的 Cookie ;
    欺骗点击无法防止,但至少你不能获取到点击后的页面返回的内容
    而 XHR 规范和嵌入式图片以及脚本是不一样的
    嵌入图片或 js / css 这类资源在规范上是允许的,并且返回内容也是可读取的
    这是 JSONP 能实现的重要依据
    但有一个重要的前提,Cookie 是不会发送的,因而请求可以认为是「无害」的

    要知道如果允许带 Cookie 请求非同源网站并且还能得到请求内容的危害性是非常大的,简直就相当于裸奔了

    在制订 XHR 规范的时候,对跨域的限制更加严格,虽然理论上不发送 Cookie 的话请求可以认为「无害」,但规范制定是默认禁止所有的跨域请求,更不会发送 Cookie,所有的决定权都留给第三方网站来决定,非同源的 XHR 请求会先发送一个不带 Cookie 的 HEAD 请求,服务端通过返回 HEAD 告诉浏览器接下来应该怎么做(是否允许请求,以及允许交换什么样的 HEADER )
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4816 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 03:50 · PVG 11:50 · LAX 19:50 · JFK 22:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.