链接:https://www.zhihu.com/question/20182967/answer/76631201
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
COOKIE由于存储在客户端,有被随意篡改的风险,所以其实服务器判断用户登陆状态,一般都是用SESSION的...SESSION的数据存储在服务器中,但是必须通过客户端的COOKIE来找到对应的SESSION
所以用户登录的过程实际上是
1:用户输入用户名密码,POST数据到服务器
2:服务器判断用户名密码是否正确,若正确,则在客户端创建一个存储SESSION_ID的COOKIE,并且在服务器中创建一个相对应的SESSION_ID的SESSION,SESSION里面的数据可能为用户的数据
3:以后该用户进行操作时,先从客户端取出SESSION_ID,找到服务器相对应的SESSION,取出数据,进行校验后再进行下一步操作..
然后说说我理解的保持登陆状态
由于COOKIE存储在客户端,所以不建议用isset($_COOKIE[‘username‘])来判断用户是否登陆.
因为用户完全可以伪造一个COOKIE,来达到欺骗服务器的目的...
那么,我想到的两种方法是:
1:上面有人说了,存储username和加密的密码,再次访问时,服务器取出COOKIE数据,与数据库做校对,如果通过,则判断为已经登陆
2:建立一个MySQL表,里面存cookie_id,username,expire,time,然后每次登陆时,根据用户选择保存登陆时间,来生成一个md5加密的cookie_id(可以用username,时间戳和随机数生成),然后将cookie_id,username,用户保持的登陆时间,当前时间戳一起插入数据库中,并且创建一个名为cookieid,值为上述md5加密的cookie_id的COOKIE.
那么下一次用户访问时,服务器可以先取COOKIE,根据COOKIE里的cookieid找到相对应的数据库中的数据,判断有无合法COOKIE,有无生命周期等...如果全部通过就能判定为登陆了