如何设计用户登录

by spud

这篇文章是对自己实践的一份总结,未必靠谱,牛人看了觉得有误请别吝惜手中板砖。

第一种:最简陋的方法,直接在用户名密码与数据库中的记录匹配后设置一个session,浏览器一关它就没了,需要重新登录

第二种:将用户名密码存在cookie里,保存一段时间,期间访问网站时就尝试用他们登录。成功后设置session,避免每次重复访问数据库作检查。但是如果有坏朋友来用你的电脑,翻下cookie就能知道你的密码了。

第三种:所以在之前的基础上,我们把密码用md5或者sha1加密一下。每次不是直接匹配用名和密码,而是通过用户名找到密码,再把密码加密一下看是否与你提供的一致。坏朋友又来了,这回他不知道你的密码了,但是他把这对cookie拷回去,又可以冒充你来登录了。

第四种:所以我不但要避免别人得到我登录信息,还要防止别人拿到cookie后可以伪造登录。

于是现在的做法是登录成功后把sessionid,用户id,ip信息,浏览器信息等一起保存在服务器这边。cookie里只保存这个sessionid,以及其他信息一起加密后的字串,相当于一个信物。

登录的时候服务器就可以拿到它保存着的信息,然后获取你正在使用的ip与浏览器信息,用相同的办法加密出来和你手里的结果一比对就知道是不是你了。坏朋友把你的cookie带回家,但是他登录时的ip或浏览器与你使用的不同就不管用。

当然他可以把这些也记下来,回去也一并伪造了,还可以猜测信息连接的顺序,所使用的加密算法等,也就是几十种组合,狗屎运的话还是可以试出来。

那就在加密的时候再加一个只在服务器这边记录的字串,道理上,他就彻底没辙了。这样做就相当于以前我为了开个门一直把钥匙留在身边,大多情况够用了。但别人可以偷过去复制一把。所以我们只保留一个信条,每次要开门的时候出示一下,然后保管员会看一下你的面容啊,指纹啊什么的再去和资料库里比对一下,然后帮你把门开了。

总结:

当然用户登录这种事情其实还要麻烦很多,比如绑定第三方账号啊(说白了就是多配几把能开门的钥匙),多账户切换啊,跨域问题啊等等(这些就不是很明白了,还没亲手接触到),要保证正确的人随便怎样都能简单快速的登录,想干坏事的随便怎样都登录不了,难度还是有点的。

事后试了一下几个主流网站,就在本本上记录个cookie再跑去台式机上设一下,结果大多数时候不鸟你,不过也有少数妖怪情况会成功,不高兴仔细琢磨了,总之不鸟你才是对的。如果本文有说的不到位的地方欢迎补充啊。

Updata 2011-08-29: 写完之后才发现几天前coolshell上有一篇更为详尽,前后端都有涉及的文章,非常不错。点此