今天看了 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. 用户体验再差一点,网络不好导致连接断开是不是也要退出了。
1
justdoit123 OP 讨论讨论,是我想得太天真的部分,请指出吧。
|
2
fy 2016-01-10 00:53:47 +08:00
楼主翻一下 http2
然后翻一下异步 WebSocket 相关的资料 |
3
oott123 2016-01-10 00:54:07 +08:00 1
这就好比你说走路上班容易被车撞,那就买个直升飞机吧。
|
4
hantsy 2016-01-10 01:05:53 +08:00
Websocket 只是一个标准,,,不局限于浏览器。我们之前项目已经有 Server 端与 Android 程序交互,简单的方式代替了笨重的消息推送。
HTTP 是无状态, WebSocket 的连接太消耗性能,事件机制在 Web 上,多客户端情况下只有有少数情况才适应,全部 WS ,全维护所有客户端状态, 太天真了。当然现在有一些少数工具框架做这方面的,可能会用在股票,游戏等方面。 |
5
dndx 2016-01-10 01:08:36 +08:00
CSRF 明明有更简单的方法来防止, WS 本身并不是为了解决 CSRF 问题设计的,用起来有小题大做之嫌。
|
6
justdoit123 OP @fy http2 看到的貌似相关的是连接复用。但是能用来代替身份信息吗?另外, WebSocket 异步还在看。
|
7
justdoit123 OP @dndx 什么方法? 嗯嗯,知道 WS 不是为 CSRF 设计的。 哈哈~ 是想太大了点。
|
8
justdoit123 OP @hantsy 呃, android 的安装客户多的时候怎么办?
|
9
ryd994 2016-01-10 01:20:53 +08:00
HTTP 套 WebSocket 套 HTTP2 ……
|
10
FrankFang128 2016-01-10 02:31:15 +08:00 via Android
CSRF 是这么防的么?
|
11
lincanbin 2016-01-10 09:30:26 +08:00
1 、 CSRF 不难防
2 、 ws 资源消耗爆炸 3 、无法自动登录等等一堆问题你自己都知道了 |
12
cmxz 2016-01-10 09:51:41 +08:00
没看懂为何 WS 可以防 CSRF
|
13
Citrus 2016-01-10 10:02:09 +08:00 via iPhone
|
14
nbndco 2016-01-10 10:32:58 +08:00
虽然我不知道你这堆东西到底有什么意义
不过你完全没有理解 CSRF 你这样做完全不影响 CSRF |
15
gamexg 2016-01-10 11:07:47 +08:00 1
目前这些攻击其实都有简单的解决办法了,加 token 即可解决这个攻击。
如果是用框架的话,很多都自带防护功能,根本不用担心这个问题。 还有标准的浏览器发起的请求都带 Referer 字段,表明了请求来自哪个网站,你自己不做检查被攻击了那就没办法了。 楼主自己实现一套协议,你需要所有的客户端都支持你的协议,这个难度只能说... 这样还不如写个插件直接禁止网站向第三方发起请求呢。 |
17
zado 2016-01-10 12:38:22 +08:00 3
WebSocket 设计得好并不会占用太多资源。我做的 http://www.zxxq.sinaapp.com/zxjb.html 能够长时间保持 10 万的连接,只有 1G 内存的 windows2008 服务器。
|
18
imn1 2016-01-10 12:55:27 +08:00 2
最重要一点: http 是短连接,无状态既是缺点也是优点, LZ 想过么
|
19
chemzqm 2016-01-10 14:38:43 +08:00
推荐一本书《浏览器网络技术》,我看了 2 遍,每次看都会有新的收获。
|
20
stevegy 2016-01-10 14:40:16 +08:00
呵呵哒~~~楼主是不准备让我们这帮在企业防火墙和 http proxy 后面的人过不上幸福生活啊
|
21
KIDJourney 2016-01-10 14:45:38 +08:00
CSRF 最常用的方法就是 token 和敏感操作二次认证吧。
|
22
nmgwddj 2016-01-10 14:48:18 +08:00
搜索一下 Meteor
|
24
chuxiwen 2016-01-10 15:02:58 +08:00 via iPhone 1
解决 CSRF , http 本身就可以做好。认证 token 也可以不放在 cookie 里。
websocket 替代 http 是另外一个问题。主要原因还是浏览器的支持吧,而且现在的 websocket 的默认 handshake 还是通过 http 。 Http2 刚出来,的推行估计要比 wehsocket 晚太多。 web 技术统一一直都是行业难题,作为从业者只能适应。 在一个完美的世界,应该会有一个 protocol 所有的浏览器都完美支持,这个 protocol 自己也应该是 轻量级,可扩展,支持 async ,也可以 stateful , bug free ,没有安全漏洞,有好用的 API ... |
25
hantsy 2016-01-10 15:13:40 +08:00
@KIDJourney CSRF 如果用 Spring 的话, Spring Security 很早就内置了。 JSF 2.2 也内置了,其它语言和技术框架估计也就是一个类似 Filter 的方案能够解决。
|
26
500miles 2016-01-10 15:52:54 +08:00
和 csrf 没什么关系吧。。。。
现行标准下, websocket 连接的建立, 也是先通过 http 请求来的。。。 别提替代这个词儿 。 。 。 。 。 。 。相得益彰啊 互相补充啊 多好!!! |
27
zonghua 2016-01-10 16:25:28 +08:00 via iPhone
http2 来啦, websocket
|
28
justdoit123 OP |
29
justdoit123 OP |
30
justdoit123 OP @gamexg 哈哈~ 他们当然不会实现这些协议了。就是讨论讨论~ 先想嘛~
|
31
justdoit123 OP @imn1 嗯嗯。也是优势,双刃剑。
|
32
justdoit123 OP @stevegy 哪有这等恶意啊~ 讨论讨论 无忌哈~
|
33
justdoit123 OP @zado 收藏,体验体验
|
34
justdoit123 OP @chuxiwen 是放在 url 或隐藏域里吗嘛?
|
35
nbndco 2016-01-10 19:15:29 +08:00 2
@mistkafka 你完全没有理解 CSRF 是什么。
在你的假设下,每次用户打开浏览器后,需要重新登录网站之后在关闭浏览器前都可以使用(因为所谓可信的链接的已经建立了),其实这只需要 cookie 的 expires 设成空就可以了,不过你愿意折腾一下那就折腾一下。 那么如果你现在先访问了 bank.com ,登录进去了,由于链接一直保持着,所以之后访问 bank.com 都可以被认证为你。接下来,你访问了 hot.xxx 网站,网站中有一个图片指向 src="http://bank.com/transfer?to=myaccount&amount=100000",会如何?浏览器直接使用之前建立的所谓可信链接访问 bank.com ,直接转账成功,和 cookie 是一模一样的。 所以说你根本没有理解什么是 CSRF 。 |
36
rannnn 2016-01-10 19:21:52 +08:00
https://www.meteor.com 不就是完全用 WebSocket 的框架吗
|
37
loading 2016-01-10 19:33:58 +08:00 via Android 1
学得还不够深
|
38
babytomas 2016-01-10 19:39:34 +08:00
判断浏览器不是可以看 UA 吗
|
39
justdoit123 OP @nbndco 我 x 嘞。愚钝了。
|
40
chemzqm 2016-01-10 19:46:08 +08:00 1
@mistkafka 英文名 《 High Performance Browser Networking 》, kindle 上有卖
|
41
RangerWolf 2016-01-10 20:12:33 +08:00 1
@zado 请问有相关资料推荐学习吗? 或者介绍一下你的经验? 谢谢
|
42
RangerWolf 2016-01-10 20:14:56 +08:00
@chemzqm 百度 google 都搜不到啊? “浏览器网络技术” 是书的全名?
|
43
KIDJourney 2016-01-10 21:01:45 +08:00
@hantsy 是哒。一般在响应请求之前会过一层中间件,中间件会检查请求是否合法。
|
44
martianyi 2016-01-10 21:17:37 +08:00 1
@RangerWolf 中文名《 Web 性能权威指南》
|
45
strwei 2016-01-10 21:20:31 +08:00
webRTC
|
46
plantain 2016-01-10 21:33:30 +08:00
搭车问:怎么用 CSRF 方式攻击 RESTful API (身份验证是 http only & secure 的 cookie; 没有 csrf token 机制)?
|
47
looyao 2016-01-10 21:47:11 +08:00
最近要做弹幕,感觉 WebSocket 很合适,不管是 WEB 端还是移动 App 端。
不过不是所有场景都适合长连接,太耗资源。 |
48
RangerWolf 2016-01-11 14:30:24 +08:00
@martianyi 原来就是这一本! 非常感谢!
|
49
coderHuang 2016-01-11 16:47:21 +08:00
实现的比较好的 RESTful 的 API 也可以避免 CSRF 的
|