【】把网站账户相关信息存入 cookie 真的不安全吗

【在线等】把网站账户相关信息存入 cookie 真的不安全吗?
本帖最后由 jianlanzq 于 2014-11-24 16:57:53 编辑
账号登录之后,网站肯定是需要保存用户的登录信息。

如果用 session,那么会很容易丢失。
(不要说在 iis 或者 web.config 中设置,理论党请走开。)

如果用 cookie ,有人会说不安全,客户端可以篡改或者伪造等等。

我的问题是:
1.  客户端怎么去篡改或者伪造我网站的 cookie ?
2.  如果1被证实确实可以篡改或者伪造,难么淘宝、百度等一线网站是怎么做的?
------解决思路----------------------
保存用户的登录信息,还得是在服务器端做。
如果只想在客户端保存的话,那你怎么去判断这个用户密码正确性。
------解决思路----------------------
 cookie 是存在客户端的,不安全指的不是数据不安全,(你觉得不安全,完全可以自己加密后在丢进Cookie),是不稳定,你存在COOKIE,要是用户禁用了cookie呢?,那是不是用不了你的网站了?..
------解决思路----------------------
在cookie中应该保存一个信息编码,例如guid形式的编号,而不是把“账号”甚至“密码”之类的业务内容保存在cookie。

就算是一个游客(或者用户)名下有5M信息,你在cookie中也不过保存一个编号而已。而不是业务内容本身!

就asp.net的Session集合而言,它也是在cookie中保存了一个 SessionID 编号,然后在服务器内存中保存各个SessionID对应的成千上万的信息内容。所以说asp.net的Session有多安全,那么cookie就有多安全。

关键是有些人“傻了吧唧地”在cookie中直接保存用户名、密码、购物车内容等等信息,这就不安全了。
------解决思路----------------------
有的人非要走幼稚的极端,如果不用session,就非要在cookie中直接保存一堆业务内容。然后就非要争论“cookie其实挺安全的”问题。原因是思想上只能看懂最不需要太动脑筋的说明。

如果我们不用session,那么我们可服务器内存中的Session集合内容放到我们自己的数据库中,或者放到我们自己的内存服务器上,而仍然使用“在cookie中仅保存一个随机产生的id号”的好设计!
------解决思路----------------------
引用:
Quote: 引用:

保存用户的登录信息,还得是在服务器端做。
如果只想在客户端保存的话,那你怎么去判断这个用户密码正确性。


最初登录时判断一次,正确之后,就只保存用户名在 cookie 中。
之后再用时,就只是判断 cookie 是否存在,不再判断用户密码的正确性。

那你可以这么想一下,怎么样才能判断是第一次登陆,我cookie里已存在,不访问login页面,我直接访问主界面,是不是代表我已经登陆了呢!
那好,我现在用户名admin,密码admin.,已经有了这个cookie值,只要有这个cookie的IE是不是都代表登陆了呢?
不管你的算法多牛,我不破解,我就用这个cookie值访问你的网站。你发现了问题,你在后台把admin用户删除了,但是我还是能访问你的网站,还是已登陆状态。
------解决思路----------------------
应该存储服务器随机生成的一个token(至于是guid还是随机数无所谓),并且服务器上这个token会因为时间过期,或者用户修改密码而改变,这样就解决了通过伪造token冒名登录的问题了。
------解决思路----------------------
引用:
Quote: 引用:

应该存储服务器随机生成的一个token(至于是guid还是随机数无所谓),并且服务器上这个token会因为时间过期,或者用户修改密码而改变,这样就解决了通过伪造token冒名登录的问题了。


如果是随机生成的 token,那么客户端应该就没有可能性伪造出来吧?这几率忒低啊,500W 彩票一样。
根据修改密码而改变,这个实用,受教,谢谢。
不过时间过期,是说存储在客户端的同时,更改数据表中的字段值,为这个时间吗?
假定设置3个小时,那么每次刷新页面时,就拿数据库里的这个时间和cookie在客户端的物理创建时间做对比?是这样吗?


你在服务器上存储 token + 生成时间

需要比较的时候先看当前时间是否超过生成时间+你设定的过期时间,如果过期,无论是否符合token都拒绝。
如果session中存活,就重新生成token并且发回客户端,相当于续时。
------解决思路----------------------
引用:
Quote: 引用:

应该存储服务器随机生成的一个token(至于是guid还是随机数无所谓),并且服务器上这个token会因为时间过期,或者用户修改密码而改变,这样就解决了通过伪造token冒名登录的问题了。


额,还有个问题:
”这样就解决了通过伪造token冒名登录的问题了“
这意思好像是,真的可以伪造 cookie ,修改 cookie 中的值。
怎么做到的。。?

cookie是http请求的一部分,客户端想发什么内容就发什么内容。
如果你用过httpwebrequest么?你要知道不是只有浏览器可以请求服务器的数据,你也可以写个程序随便请求。

另外,我们要防范来自网络监听者的攻击,http是明文传输的,你发来的cookie也好,token也好,服务器返回的数据也好,如果网络节点上有人拦截,都可以获取,那么他就可以利用这些信息冒名登录了。

所以用户验证一定要使用ssl,否则别的都是白扯。
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

保存用户的登录信息,还得是在服务器端做。
如果只想在客户端保存的话,那你怎么去判断这个用户密码正确性。


最初登录时判断一次,正确之后,就只保存用户名在 cookie 中。
之后再用时,就只是判断 cookie 是否存在,不再判断用户密码的正确性。

那你可以这么想一下,怎么样才能判断是第一次登陆,我cookie里已存在,不访问login页面,我直接访问主界面,是不是代表我已经登陆了呢!
那好,我现在用户名admin,密码admin.,已经有了这个cookie值,只要有这个cookie的IE是不是都代表登陆了呢?
不管你的算法多牛,我不破解,我就用这个cookie值访问你的网站。你发现了问题,你在后台把admin用户删除了,但是我还是能访问你的网站,还是已登陆状态。


首先,我用的是临时cookie,生命周期以浏览器关闭为结束。
其次,即使是长久cookie,既然已有,那么为什么还要通过 login 呢? 
我的 login 页面是有判断的,提示您已登录,可以直接进入后台。
最后,cookie 默认是有域限制的,并不是 cookiename 一样,就畅通无阻了,少年。。
你自己去测试测试先。

cookie值服务器是怎么知道的,是不是发起请求的时候,把cookie值发送过的。
那么模拟登陆你听说过么?我可以把你要的cookie发过去,你怎么去分辨?
------解决思路----------------------
当然我主要是讲原理,比如说你用asp.net,它的form验证,就已经封装好了,其中cookie ticket相当于我说的token,sessionid->cookie也是底层实现的,未必这些概念你真的都用到,但是你不懂这些原理,用起来就会觉得很迷惑。
------解决思路----------------------
好比你去药店买散利痛或者必理通,其实它们都是商品名,化学品名都是对乙酰氨基酚(俗称扑热息痛)。
所以不要被什么guid、FormsAuthenticationTicket(俗称票据)之类的名词迷惑。它们都是基于相同原理的东西。
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

应该存储服务器随机生成的一个token(至于是guid还是随机数无所谓),并且服务器上这个token会因为时间过期,或者用户修改密码而改变,这样就解决了通过伪造token冒名登录的问题了。


额,还有个问题:
”这样就解决了通过伪造token冒名登录的问题了“
这意思好像是,真的可以伪造 cookie ,修改 cookie 中的值。
怎么做到的。。?

cookie是http请求的一部分,客户端想发什么内容就发什么内容。
如果你用过httpwebrequest么?你要知道不是只有浏览器可以请求服务器的数据,你也可以写个程序随便请求。

另外,我们要防范来自网络监听者的攻击,http是明文传输的,你发来的cookie也好,token也好,服务器返回的数据也好,如果网络节点上有人拦截,都可以获取,那么他就可以利用这些信息冒名登录了。

所以用户验证一定要使用ssl,否则别的都是白扯。


”你要知道不是只有浏览器可以请求服务器的数据,你也可以写个程序随便请求“,明白。
"都可以获取,那么他就可以利用这些信息冒名登录了" ,这个不明白。
他能获取到我的用户名,但是我没有把密码存入cookie,他没有密码怎么去登录呢?
并且cookie不是有域限制吗,这个我理解是只有在域名下生成的 cookie,才适用于该域,他自己创建一个,域可以设置为我的域名吗?


攻击者可以拦截你的整个http报文,包括你输入的用户名和密码。
------解决思路----------------------
一些初级黑客专门在机场、车站、饭店、商场这些地方开一个免费的wifi,吸引用户连接,只要http报文经过他的机器,他就能得到这些信息了。这是那些中学生业余黑客都干的事情。

所以支付宝等系统会让你在一个他设计的控件中输入密码。