让 WebSocket 代替 HTTP 吧。。。。

2016-01-10 00:49:27 +08:00
 justdoit123

今天看了 CSRF ,觉得好沉重啊。 突然有下面的设想,不知道有多少可行性,有很多地方不熟悉,例如 server 验证客户端可信等方面不懂。大家一起看下。

让 WebSoket 替代 HTTP 进行通讯的设想如下:
1. 浏览器要通过系统验证,通过验证的浏览器才能使用。( Chrome 、 Safari 、 Firefox...)
2. 用户用某浏览器(设为 B1 ),访问某站点(设为 S1 ), S1 与 B1 之间就创建一条 WebSocket 连接。用户访问 S1 的任何页面、不管同时开启几个页面(都是使用 B1 浏览器), S1 与 B1 之间都有且仅有一条 WebSocket 连接作为通讯。
3. 用户在电脑中安装了 N 个通过验证的浏览器,那么此用户与 S1 的连接数最大值即为 N ,保护服务器。
4. 站点在与客户端(也就是浏览器)建立连接前,要验证浏览器的合法性。这点能否做到?

CSRF 的难以防范主要是没有办法确认请求来自源页面,上面的方案是否就可以解决这样的问题?因为 ws 是有状态的连接,不需要 session 、不需要把身份信息保存在客户端,连接本身就是身份验证的象征,连接没法伪装(能伪装?没做过什么 C/S 应用,不确定 T_T )

这可能会带来如下问题:
1. SSO 可能没法进行了, SSO 是通过 cookie 作为信息媒介共享身份 token 的。
2. 服务器压力问题。如果所有连接都是长时间活跃的那还没问题,如果一大堆僵死连接,连了之后都没操作,服务器在维持连接方面会耗费大量资源。这个是不是可以通过代理服务器来解决?即大量代理服务器专门用来承担连接保活的工作,请求则转发给处理服务器,再把结果转发给用户。
3. 用户体验变差,没有 SSO 。同时也没有“记住我”的功能,每次关闭浏览器后连接都会关闭,会话结束,即退出登录。 能不能有类似记住密码、自动登录的机制来弥补下。。?
4. 用户体验再差一点,网络不好导致连接断开是不是也要退出了。

10803 次点击
所在节点    程序员
50 条回复
KIDJourney
2016-01-10 14:45:38 +08:00
CSRF 最常用的方法就是 token 和敏感操作二次认证吧。
nmgwddj
2016-01-10 14:48:18 +08:00
搜索一下 Meteor
hantsy
2016-01-10 14:51:47 +08:00
@nmgwddj Meteor 估计一般 JS 程序员也可以写出来的也是一团糟的东西,其中事件通知更新范围是技巧。
chuxiwen
2016-01-10 15:02:58 +08:00
解决 CSRF , http 本身就可以做好。认证 token 也可以不放在 cookie 里。

websocket 替代 http 是另外一个问题。主要原因还是浏览器的支持吧,而且现在的 websocket 的默认 handshake 还是通过 http 。

Http2 刚出来,的推行估计要比 wehsocket 晚太多。

web 技术统一一直都是行业难题,作为从业者只能适应。

在一个完美的世界,应该会有一个 protocol 所有的浏览器都完美支持,这个 protocol 自己也应该是 轻量级,可扩展,支持 async ,也可以 stateful , bug free ,没有安全漏洞,有好用的 API ...
hantsy
2016-01-10 15:13:40 +08:00
@KIDJourney CSRF 如果用 Spring 的话, Spring Security 很早就内置了。 JSF 2.2 也内置了,其它语言和技术框架估计也就是一个类似 Filter 的方案能够解决。
500miles
2016-01-10 15:52:54 +08:00
和 csrf 没什么关系吧。。。。

现行标准下, websocket 连接的建立, 也是先通过 http 请求来的。。。

别提替代这个词儿 。 。 。 。 。 。 。相得益彰啊 互相补充啊 多好!!!
zonghua
2016-01-10 16:25:28 +08:00
http2 来啦, websocket
justdoit123
2016-01-10 19:04:49 +08:00
@chemzqm 这本书没找到, z.cn 、豆瓣京东等都没有。能给个链接吗?
@500miles “替代”确实不好,进步改进
justdoit123
2016-01-10 19:06:39 +08:00
@500miles
@nbndco
@cmxz

连接本身就可以代表身份,同一条连接没有办法被伪造,所以伪造请求也就变得不可能。当然,这里的请求是指带有身份信息的请求,涉及隐私安全。
justdoit123
2016-01-10 19:08:16 +08:00
@gamexg 哈哈~ 他们当然不会实现这些协议了。就是讨论讨论~ 先想嘛~
justdoit123
2016-01-10 19:09:01 +08:00
@imn1 嗯嗯。也是优势,双刃剑。
justdoit123
2016-01-10 19:09:56 +08:00
@stevegy 哪有这等恶意啊~ 讨论讨论 无忌哈~
justdoit123
2016-01-10 19:10:50 +08:00
@zado 收藏,体验体验
justdoit123
2016-01-10 19:13:17 +08:00
@chuxiwen 是放在 url 或隐藏域里吗嘛?
nbndco
2016-01-10 19:15:29 +08:00
@mistkafka 你完全没有理解 CSRF 是什么。

在你的假设下,每次用户打开浏览器后,需要重新登录网站之后在关闭浏览器前都可以使用(因为所谓可信的链接的已经建立了),其实这只需要 cookie 的 expires 设成空就可以了,不过你愿意折腾一下那就折腾一下。
那么如果你现在先访问了 bank.com ,登录进去了,由于链接一直保持着,所以之后访问 bank.com 都可以被认证为你。接下来,你访问了 hot.xxx 网站,网站中有一个图片指向 src="http://bank.com/transfer?to=myaccount&amount=100000",会如何?浏览器直接使用之前建立的所谓可信链接访问 bank.com ,直接转账成功,和 cookie 是一模一样的。

所以说你根本没有理解什么是 CSRF 。
rannnn
2016-01-10 19:21:52 +08:00
https://www.meteor.com 不就是完全用 WebSocket 的框架吗
loading
2016-01-10 19:33:58 +08:00
学得还不够深
babytomas
2016-01-10 19:39:34 +08:00
判断浏览器不是可以看 UA 吗
justdoit123
2016-01-10 19:41:58 +08:00
@nbndco 我 x 嘞。愚钝了。
chemzqm
2016-01-10 19:46:08 +08:00
@mistkafka 英文名 《 High Performance Browser Networking 》, kindle 上有卖

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/249607

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX