如何设计用户登录
by spud
这篇文章是对自己实践的一份总结,未必靠谱,牛人看了觉得有误请别吝惜手中板砖。
第一种:最简陋的方法,直接在用户名密码与数据库中的记录匹配后设置一个session,浏览器一关它就没了,需要重新登录
第二种:将用户名密码存在cookie里,保存一段时间,期间访问网站时就尝试用他们登录。成功后设置session,避免每次重复访问数据库作检查。但是如果有坏朋友来用你的电脑,翻下cookie就能知道你的密码了。
第三种:所以在之前的基础上,我们把密码用md5或者sha1加密一下。每次不是直接匹配用名和密码,而是通过用户名找到密码,再把密码加密一下看是否与你提供的一致。坏朋友又来了,这回他不知道你的密码了,但是他把这对cookie拷回去,又可以冒充你来登录了。
第四种:所以我不但要避免别人得到我登录信息,还要防止别人拿到cookie后可以伪造登录。
于是现在的做法是登录成功后把sessionid,用户id,ip信息,浏览器信息等一起保存在服务器这边。cookie里只保存这个sessionid,以及其他信息一起加密后的字串,相当于一个信物。
登录的时候服务器就可以拿到它保存着的信息,然后获取你正在使用的ip与浏览器信息,用相同的办法加密出来和你手里的结果一比对就知道是不是你了。坏朋友把你的cookie带回家,但是他登录时的ip或浏览器与你使用的不同就不管用。
当然他可以把这些也记下来,回去也一并伪造了,还可以猜测信息连接的顺序,所使用的加密算法等,也就是几十种组合,狗屎运的话还是可以试出来。
那就在加密的时候再加一个只在服务器这边记录的字串,道理上,他就彻底没辙了。这样做就相当于以前我为了开个门一直把钥匙留在身边,大多情况够用了。但别人可以偷过去复制一把。所以我们只保留一个信条,每次要开门的时候出示一下,然后保管员会看一下你的面容啊,指纹啊什么的再去和资料库里比对一下,然后帮你把门开了。
总结:
当然用户登录这种事情其实还要麻烦很多,比如绑定第三方账号啊(说白了就是多配几把能开门的钥匙),多账户切换啊,跨域问题啊等等(这些就不是很明白了,还没亲手接触到),要保证正确的人随便怎样都能简单快速的登录,想干坏事的随便怎样都登录不了,难度还是有点的。
事后试了一下几个主流网站,就在本本上记录个cookie再跑去台式机上设一下,结果大多数时候不鸟你,不过也有少数妖怪情况会成功,不高兴仔细琢磨了,总之不鸟你才是对的。如果本文有说的不到位的地方欢迎补充啊。
Updata 2011-08-29: 写完之后才发现几天前coolshell上有一篇更为详尽,前后端都有涉及的文章,非常不错。点此。
疑问:你的第四种方法,如果用户重启机器后登陆,动态IP变成其他了,是不是得重新登陆
嗯,的确没考虑动态ip的情况,这里倒是可以放松下限制,主要讨论的是个想法。不知道ip是动态的情况下,有没有判断是否是同一台电脑……
我从coolshell.cn的那篇设计web用户登录的博客链接到这里,我原来一直没仔细的思考过这个问题。我考虑的是无论用户在哪里登录都可以保存登录信息,但是如果要在线付款、涉及到非常重要的操作才需要重新登录或采用手机验证等手段。
嗯,我也是这么觉得。重要的地方,手机验证还是很靠谱的。