让 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. 用户体验再差一点,网络不好导致连接断开是不是也要退出了。

10492 次点击
所在节点    程序员
50 条回复
justdoit123
2016-01-10 00:51:36 +08:00
讨论讨论,是我想得太天真的部分,请指出吧。
fy
2016-01-10 00:53:47 +08:00
楼主翻一下 http2
然后翻一下异步 WebSocket 相关的资料
oott123
2016-01-10 00:54:07 +08:00
这就好比你说走路上班容易被车撞,那就买个直升飞机吧。
hantsy
2016-01-10 01:05:53 +08:00
Websocket 只是一个标准,,,不局限于浏览器。我们之前项目已经有 Server 端与 Android 程序交互,简单的方式代替了笨重的消息推送。

HTTP 是无状态, WebSocket 的连接太消耗性能,事件机制在 Web 上,多客户端情况下只有有少数情况才适应,全部 WS ,全维护所有客户端状态, 太天真了。当然现在有一些少数工具框架做这方面的,可能会用在股票,游戏等方面。
dndx
2016-01-10 01:08:36 +08:00
CSRF 明明有更简单的方法来防止, WS 本身并不是为了解决 CSRF 问题设计的,用起来有小题大做之嫌。
justdoit123
2016-01-10 01:09:00 +08:00
@fy http2 看到的貌似相关的是连接复用。但是能用来代替身份信息吗?另外, WebSocket 异步还在看。
justdoit123
2016-01-10 01:10:33 +08:00
@dndx 什么方法? 嗯嗯,知道 WS 不是为 CSRF 设计的。 哈哈~ 是想太大了点。
justdoit123
2016-01-10 01:12:31 +08:00
@hantsy 呃, android 的安装客户多的时候怎么办?
ryd994
2016-01-10 01:20:53 +08:00
HTTP 套 WebSocket 套 HTTP2 ……
FrankFang128
2016-01-10 02:31:15 +08:00
CSRF 是这么防的么?
lincanbin
2016-01-10 09:30:26 +08:00
1 、 CSRF 不难防
2 、 ws 资源消耗爆炸
3 、无法自动登录等等一堆问题你自己都知道了
cmxz
2016-01-10 09:51:41 +08:00
没看懂为何 WS 可以防 CSRF
Citrus
2016-01-10 10:02:09 +08:00
@dndx 应该说,完全不能用来防 CSRF
@mistkafka 你确定你真的理解了 CSRF 的意义么。。。
nbndco
2016-01-10 10:32:58 +08:00
虽然我不知道你这堆东西到底有什么意义
不过你完全没有理解 CSRF
你这样做完全不影响 CSRF
gamexg
2016-01-10 11:07:47 +08:00
目前这些攻击其实都有简单的解决办法了,加 token 即可解决这个攻击。
如果是用框架的话,很多都自带防护功能,根本不用担心这个问题。

还有标准的浏览器发起的请求都带 Referer 字段,表明了请求来自哪个网站,你自己不做检查被攻击了那就没办法了。

楼主自己实现一套协议,你需要所有的客户端都支持你的协议,这个难度只能说...
这样还不如写个插件直接禁止网站向第三方发起请求呢。
nbndco
2016-01-10 12:09:31 +08:00
@gamexg referer 没用的, https 就不发送了
zado
2016-01-10 12:38:22 +08:00
WebSocket 设计得好并不会占用太多资源。我做的 http://www.zxxq.sinaapp.com/zxjb.html 能够长时间保持 10 万的连接,只有 1G 内存的 windows2008 服务器。
imn1
2016-01-10 12:55:27 +08:00
最重要一点: http 是短连接,无状态既是缺点也是优点, LZ 想过么
chemzqm
2016-01-10 14:38:43 +08:00
推荐一本书《浏览器网络技术》,我看了 2 遍,每次看都会有新的收获。
stevegy
2016-01-10 14:40:16 +08:00
呵呵哒~~~楼主是不准备让我们这帮在企业防火墙和 http proxy 后面的人过不上幸福生活啊

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

https://www.v2ex.com/t/249607

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

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

© 2021 V2EX