我想知道token和sessionid的区别是什么

2013-08-23 15:19:59 +08:00
 leonwong
我对token的概念其实是很模糊的,大概知道为了防止CSRF的攻击,服务器创建session时会随机生成一个token值,存入session中,然后网页前端请求的时候会附带token信息,服务器会做匹配,但是不清楚,这和sessionid的匹配有何区别?另外网页前端如何获取token呢?
43648 次点击
所在节点    程序员
42 条回复
leonwong
2013-08-24 23:09:07 +08:00
@undeadking
@PrideChung
我是用JQuery.ajax来处理纯静态页面表单值,所以我也需要考虑CSRF攻击。不知这种处理方式常见不?
另外我对我这样的做法的安全性很质疑,不知除了token以外还有什么需要改进?或者说一般的安全措施是什么?
zzNucker
2013-08-24 23:22:58 +08:00
@leonwong 你为什么质疑 说出来听听吧

你这个如果前台页面完全无法输出信息的话是有点困难 因为这样意味着你的页面的所有东西都是完全可以直接构造出来的。。。。
binux
2013-08-25 00:03:13 +08:00
说那么多token,session的。叫token的多了去了,这些概念都是伪的。
对于HTTP协议来说,就是url,header,body
对于WEB页面来说,就是url,form/post body,cookie

好了,现在有的就是这么多东西,要怎么用呢?

首先是第一个问题,HTTP请求是无状态的,我怎么知道谁是谁?
解:让用户每次访问的时候告诉你它叫什么,怎么告诉?url,form/post body,cookie

然后是第二个问题,用户访问的时候说他自己是张三,他骗你怎么办?
解:在服务器端保存张三的信息,给他一个id,让他下次用id访问。id保存在url,form/post body,cookie中。这叫做session

现在是第三个问题,用户提交了一笔订单,你怎么保证他是在你的订单页面提交的?(referer可能是一个办法)
解:在你订单页面中放入一个加密的信息,只有真正打开了订单页才能知道,提交的时候将这个信息返回回来。这个东西,可以被叫做token
PrideChung
2013-08-25 00:39:30 +08:00
@leonwong jQuery处理表单,你是让浏览器自己跟自己玩?既然是填表单你总要Post到某台服务器上的吧,让服务器来做CSRF不就完了,有jQuery什么事。
leonwong
2013-08-25 09:08:44 +08:00
@PrideChung 我用jQuery.ajax提交到后台某action,不是自己跟自己玩
leonwong
2013-08-25 09:14:03 +08:00
@zzNucker 前台页面虽然是静态的,但是可以在静态页面加载的时候通过ajax向后台请求数据,可以达到动态页面效果。我的质疑是,如果有人获取到了我的cookie,并且知道了sessionid,就可以通过伪造请求来请求数据,所以我觉得安全性极差,可是不知如何改善?
leonwong
2013-08-25 09:20:21 +08:00
@binux 这位大侠解释的通俗易懂啊,具体实现我得细细琢磨,感谢
cxh116
2013-08-25 09:24:02 +08:00
cxh116
2013-08-25 10:03:10 +08:00
测试CSRF提交
zzNucker
2013-08-25 10:15:18 +08:00
@leonwong 没用 你ajax请求数据的时候还是会造成CSRF 这样就没办法达到Form Token效果了
除非你在发第一个请求的时候服务器就能识别出是不是用户自己发的
cxh116
2013-08-25 10:17:05 +08:00
你可以访问这个页面看看
http://hikitty.duapp.com/v2ex_test.html

因为v2ex有了token,就是once表单元素,是个hidden input,所以你访问这个页面必须得输入正确的once才能发表成功.
你需要把页面上的once字段提取出来,再手动输入进去.

如果没有once字段,那别人一访问此页面,就可以用js实现,自动调用表单的submit,从而发表一条评论.
undeadking
2013-08-25 11:45:54 +08:00
@leonwong 所以我已经说了,这个东西必须由服务端来实现,纯静态页面是搞不了的.如果ajax请求的后台要没有搞token验证,无论你怎么折腾js都是白搭.在架构上一开始你的考虑就错了.

初学者没必要在所谓的安全上钻太深,先把基础打好,能把功能做出来才是首要的
PrideChung
2013-08-25 12:38:46 +08:00
@leonwong 如果连cookies都被人截了,那搞什么都白搭。CSRF token本来就不是用来应对种情况的,要保护cookies你应该用HTTPS。
leonwong
2013-08-25 13:43:51 +08:00
@zzNucker
我是这样的,我将用户的id存在session中,每次请求利用sessionid保持session,也就是说,每次请求都能够确保是该用户发送的请求,因为session里有用户id,然后就返回对应用户json进行数据处理。我已经实现了功能,可是困惑就是不知道这种方式合理不合理?我本来也觉得纯静态实现很不可思议,但是的确也能满足业务功能,那么我想ajax也可以把hidden值提交给服务器,想来想去也没什么不妥。

@undeadking 我的业务功能已经实现了,所以我要多考虑架构和安全,我也觉得我很欠考虑,但是纯静态页面配合js实现了我想要的,token验证我想也可以通过ajax,可能性能上会有劣势,但是功能上跟动态区别不大,就当我在静态页面上的学习和探索,所以可能我会钻牛角尖。
leonwong
2013-08-25 13:45:56 +08:00
@cxh116 我还没得用电脑现在,等用电脑,立马拜读帖子
leonwong
2013-08-25 13:48:28 +08:00
@PrideChung 那如果按照这个说法,我觉得如果cookie没被窃取的话,html配合ajax实现数据请求的安全性还算比较高啊
zzNucker
2013-08-25 13:51:17 +08:00
@leonwong 就算是CSRF劫持的请求也会带上网站的cookie的,所以光验证session并不能避免CSRF
token的关键是在于你在发送请求的时候一定要保证你是读取了这个页面的。。 而不是凭空就发送请求
PrideChung
2013-08-25 14:42:56 +08:00
@leonwong 看了半天我都没看懂你程序的架构是怎样的,难道你最后处理提交表单的那台服务器根本不归你管?

另外数据传输的安全性跟是否Ajax请求无关,只要用HTTP的话就是明文传输,一样能够被截。
leonwong
2013-08-25 15:20:24 +08:00
@zzNucker
@PrideChung
token原理我已经理解了,谢谢,也谢谢楼上回答问题的各位,怪我不好,因为这两天没得用电脑,手机打字不方便,所以很多情况没说明白,等我可以用电脑的时候,我再发一帖,我会系统说明我使用的架构和平台,目的是讨论一下网站安全问题,我也会参考资料,谢谢你们的耐心解答
etata
2016-08-25 16:38:48 +08:00
@binux
还是没说为什么用 token ,不用 sessionid 啊。既然唯一 id ,放在 cookies 也是放,放在 hidden 里也是放。再说 sessionid 在 cookies 禁止的时候也是放在 url 中或者表单中啊。 为什么不统一用一个呢?

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

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

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

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

© 2021 V2EX