搜尋
首頁後端開發php教程【判断用户登录】PHP这样判断流程是否正确?每次都查询数据库 存COOKIE

我自己来做的PHP判断用户是否登录:

【流程】
1 先判断有没有cookie('uid') && cookie('uid') 如果没有跳出循环检测
2 如果有,连接数据库查询该uid对应的记录,如果没有改记录则跳出循环检测并且注销所有用户cookie
3 如果有,检测cookie('upwd')== md5($rs[pwd].cookie('salt')),如果不相等,提示密码发生修改需要重新登录
4 如果相等,检测cookie('email') == md5($rs[email]),如果不相等,提示邮箱发生更改,需要重新登录
5 如果相等 => 正确,该用户是当前登录用户。

但是!
【问题】
1 每次都要连接数据库,减少数据库查询是用户优化的关键,如果每次都去数据库查询,真的会影响性能。
2 如何优化才最好,这个登录判断流程是否有误。

【另外一种思路】
1 存放到SESSION,保存$uid,$uname,$lastactive(最后响应时间)到session中。
2 如果有session('uid') && session('uname') 检测time()-$lastactive > 3600 ,那么连接数据库查询(如上面的cookie判断),否则直接用(session存放位置php.ini默认配置的位置)

【问题】
1 如果存放到SESSION中,那么高并发的情况下,是否会受影响?


回复讨论(解决方案)

当采用第二种方案时你顾虑高并发的情况
那么采用第一种方案就可不考虑高并发的情况了吗?

在你的第一方案中,用户的口令和Email都放在cookie中,这些数据总是在网络中跑来跑去,你认为很安全吗?

数据库应该是广义的
虽然基于文件系统的关系型数据库(SQL)速度可能稍有逊色,但他们都提供有基于内存的内存表
何况数据库还有另一分支:基于内存的noSQL
所以数据库查询带来的额外开销是可以忽略不计的

判断用户是否登录的流程是:
如果 cookie('uid') 不存在 转要求登录处理
否则查询数据库,检查该 uid 上次登录地点是否与本次相同:
相同则确认
不同则发出提示,有条件转要求登录处理

当采用第二种方案时你顾虑高并发的情况
那么采用第一种方案就可不考虑高并发的情况了吗?

在你的第一方案中,用户的口令和Email都放在cookie中,这些数据总是在网络中跑来跑去,你认为很安全吗?

数据库应该是广义的
虽然基于文件系统的关系型数据库(SQL)速度可能稍有逊色,但他们都提供有基于内存的内存表
何况数据库还有另一分支:基于内存的noSQL
所以数据库查询带来的额外开销是可以忽略不计的

判断用户是否登录的流程是:
如果 cookie('uid') 不存在 转要求登录处理
否则查询数据库,检查该 uid 上次登录地点是否与本次相同:
相同则确认
不同则发出提示,有条件转要求登录处理



那每次都要查询MYSQL数据库了。根据登录地址,一般来说是IP了。

检查用户来源,是为了防止 CSRF攻击
一般只在用写动作的页面进行

我的做法是这样的。
1.用户login,连接数据库判断是否成功,如成功后把用户id,用户name等需要用到判断的信息,写入session和cookies,cookies设置一个时间(例如1天~2周,这个登入时给用户自己选择),另外,我是把存入cookies的数据做一个json_encode,然后加密处理。
例如 {"uid":1,"username":"fdipzone"} 加密成可逆的字符串。

2.当用户访问时,会有以下几种情况
1.判断session是否存在->是->通过
2.判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->是->把cookies写入session->通过
3.判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->否->跳转到login页面
4.判断session是否存在->否->判断cookies是否存在->否->跳转到login页面

我的做法是这样的。
1.用户login,连接数据库判断是否成功,如成功后把用户id,用户name等需要用到判断的信息,写入session和cookies,cookies设置一个时间(例如1天~2周,这个登入时给用户自己选择),另外,我是把存入cookies的数据做一个json_encode,然后加密处理。
例如 {"uid":1,"username":"fdipzone"} 加密成可逆的字符串。

2.当用户访问时,会有以下几种情况
1.判断session是否存在->是->通过
2.判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->是->把cookies写入session->通过
3.判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->否->跳转到login页面
4.判断session是否存在->否->判断cookies是否存在->否->跳转到login页面




你的流程貌似没有查询过数据库,很节约,但是存在漏洞问题:
1 假如账号在11点正常登录,12点账号被盗,密码被修改。可他还可以继续使用账号,和那个盗号者一起共同使用
2 假设用户密码已经发生修改,可他没有退出重新登录却可以继续使用该账号
3 更关键的不可控,假设用户在11点登陆,12点管理员封禁其账号,可他却还是可以继续使用,除非他退出重新登录一次。



我的做法是这样的。
1.用户login,连接数据库判断是否成功,如成功后把用户id,用户name等需要用到判断的信息,写入session和cookies,cookies设置一个时间(例如1天~2周,这个登入时给用户自己选择),另外,我是把存入cookies的数据做一个json_encode,然后加密处理。
例如 {"uid":1,"username":"fdipzone"} 加密成可逆的字符串。

2.当用户访问时,会有以下几种情况
1.判断session是否存在->是->通过
2.判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->是->把cookies写入session->通过
3.判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->否->跳转到login页面
4.判断session是否存在->否->判断cookies是否存在->否->跳转到login页面




你的流程貌似没有查询过数据库,很节约,但是存在漏洞问题:
1 假如账号在11点正常登录,12点账号被盗,密码被修改。可他还可以继续使用账号,和那个盗号者一起共同使用
2 假设用户密码已经发生修改,可他没有退出重新登录却可以继续使用该账号
3 更关键的不可控,假设用户在11点登陆,12点管理员封禁其账号,可他却还是可以继续使用,除非他退出重新登录一次。




我判断closeuser的部分在login之后进行。因为如果前面的步骤都不成功,就不需要调用closeuser判断了。

对了,有个位置漏说了,当session过期,然后把cookies写入session时。我会把这次操作的时间记录入db,作为用户的最后在线时间的。当判断上一次的最后在线时间比现在的超过10分钟,我会check一次closeuser的表,判断是否被屏蔽。如果被屏蔽,就跳到对应的信息提示页面。就是每10分钟会检查一次db吧。
判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->是-> 把cookies写入session->通过

然后,每10分钟,检查一次


我的做法是这样的。
1.用户login,连接数据库判断是否成功,如成功后把用户id,用户name等需要用到判断的信息,写入session和cookies,cookies设置一个时间(例如1天~2周,这个登入时给用户自己选择),另外,我是把存入cookies的数据做一个json_encode,然后加密处理。
例如 {"uid":1,"username":"fdipzone"} 加密成可逆的字符串。

2.当用户访问时,会有以下几种情况
1.判断session是否存在->是->通过
2.判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->是->把cookies写入session->通过
3.判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->否->跳转到login页面
4.判断session是否存在->否->判断cookies是否存在->否->跳转到login页面




你的流程貌似没有查询过数据库,很节约,但是存在漏洞问题:
1 假如账号在11点正常登录,12点账号被盗,密码被修改。可他还可以继续使用账号,和那个盗号者一起共同使用
2 假设用户密码已经发生修改,可他没有退出重新登录却可以继续使用该账号
3 更关键的不可控,假设用户在11点登陆,12点管理员封禁其账号,可他却还是可以继续使用,除非他退出重新登录一次。




第1点 其实是 假如用户在网吧或其他区域登录忘了退出,之后别人使用那台上网设备就可以操作他账号的内容,即使用户回到家里修改密码也无济于事,除非那边退出重新登录(包括关机/重启/彻底关闭浏览器进程)。



我的做法是这样的。
1.用户login,连接数据库判断是否成功,如成功后把用户id,用户name等需要用到判断的信息,写入session和cookies,cookies设置一个时间(例如1天~2周,这个登入时给用户自己选择),另外,我是把存入cookies的数据做一个json_encode,然后加密处理。
例如 {"uid":1,"username":"fdipzone"} 加密成可逆的字符串。

2.当用户访问时,会有以下几种情况
1.判断session是否存在->是->通过
2.判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->是->把cookies写入session->通过
3.判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->否->跳转到login页面
4.判断session是否存在->否->判断cookies是否存在->否->跳转到login页面




你的流程貌似没有查询过数据库,很节约,但是存在漏洞问题:
1 假如账号在11点正常登录,12点账号被盗,密码被修改。可他还可以继续使用账号,和那个盗号者一起共同使用
2 假设用户密码已经发生修改,可他没有退出重新登录却可以继续使用该账号
3 更关键的不可控,假设用户在11点登陆,12点管理员封禁其账号,可他却还是可以继续使用,除非他退出重新登录一次。




我判断closeuser的部分在login之后进行。因为如果前面的步骤都不成功,就不需要调用closeuser判断了。

对了,有个位置漏说了,当session过期,然后把cookies写入session时。我会把这次操作的时间记录入db,作为用户的最后在线时间的。当判断上一次的最后在线时间比现在的超过10分钟,我会check一次closeuser的表,判断是否被屏蔽。如果被屏蔽,就跳到对应的信息提示页面。就是每10分钟会检查一次db吧。
判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->是-> 把cookies写入session->通过

然后,每10分钟,检查一次

如果用session存放信息,当关闭浏览器(包括强制关闭浏览器进程),那么是不是session就过期了

更正一下。
当session过期,把cookies写入session时。在这个位置会连数据库判断用户是否被禁止登入。
session有自己的过期时间,所以,每次连数据库检查的时间间隔就是session的生命周期。

判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->是-> 检查是否禁止登入->否->把cookies写入session->通过

判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->是-> 检查是否禁止登入->是->清除用户cookies->跳转到通知页面




我的做法是这样的。
1.用户login,连接数据库判断是否成功,如成功后把用户id,用户name等需要用到判断的信息,写入session和cookies,cookies设置一个时间(例如1天~2周,这个登入时给用户自己选择),另外,我是把存入cookies的数据做一个json_encode,然后加密处理。
例如 {"uid":1,"username":"fdipzone"} 加密成可逆的字符串。

2.当用户访问时,会有以下几种情况
1.判断session是否存在->是->通过
2.判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->是->把cookies写入session->通过
3.判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->否->跳转到login页面
4.判断session是否存在->否->判断cookies是否存在->否->跳转到login页面




你的流程貌似没有查询过数据库,很节约,但是存在漏洞问题:
1 假如账号在11点正常登录,12点账号被盗,密码被修改。可他还可以继续使用账号,和那个盗号者一起共同使用
2 假设用户密码已经发生修改,可他没有退出重新登录却可以继续使用该账号
3 更关键的不可控,假设用户在11点登陆,12点管理员封禁其账号,可他却还是可以继续使用,除非他退出重新登录一次。




我判断closeuser的部分在login之后进行。因为如果前面的步骤都不成功,就不需要调用closeuser判断了。

对了,有个位置漏说了,当session过期,然后把cookies写入session时。我会把这次操作的时间记录入db,作为用户的最后在线时间的。当判断上一次的最后在线时间比现在的超过10分钟,我会check一次closeuser的表,判断是否被屏蔽。如果被屏蔽,就跳到对应的信息提示页面。就是每10分钟会检查一次db吧。
判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->是-> 把cookies写入session->通过

然后,每10分钟,检查一次

如果用session存放信息,当关闭浏览器(包括强制关闭浏览器进程),那么是不是session就过期了



是的,那么就会执行判断cookies的事件了。

更正一下。
当session过期,把cookies写入session时。在这个位置会连数据库判断用户是否被禁止登入。
session有自己的过期时间,所以,每次连数据库检查的时间间隔就是session的生命周期。

判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->是-> 检查是否禁止登入->否->把cookies写入session->通过

判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->是-> 检查是否禁止登入->是->清除用户cookies->跳转到通知页面



如果是这样,貌似不用再SESSION了吧。
不过关闭浏览器就session过期真的不可思议啊。。。




更正一下。
当session过期,把cookies写入session时。在这个位置会连数据库判断用户是否被禁止登入。
session有自己的过期时间,所以,每次连数据库检查的时间间隔就是session的生命周期。

判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->是-> 检查是否禁止登入->否->把cookies写入session->通过

判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->是-> 检查是否禁止登入->是->清除用户cookies->跳转到通知页面



如果是这样,貌似不用再SESSION了吧。
不过关闭浏览器就session过期真的不可思议啊。。。





session是会话进程,关闭会话消失很正常。
session其实也是cookie,只不过存活时间比较短,但是相较于cookie直接使用更安全,客户端只保存一个sessionid的cookie值,其他内容保存在服务器上,用户浏览时通过sessionid读取session的内容。

类似html5的 localStorage 和 sessionStorage



我的做法是这样的。
1.用户login,连接数据库判断是否成功,如成功后把用户id,用户name等需要用到判断的信息,写入session和cookies,cookies设置一个时间(例如1天~2周,这个登入时给用户自己选择),另外,我是把存入cookies的数据做一个json_encode,然后加密处理。
例如 {"uid":1,"username":"fdipzone"} 加密成可逆的字符串。

2.当用户访问时,会有以下几种情况
1.判断session是否存在->是->通过
2.判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->是->把cookies写入session->通过
3.判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->否->跳转到login页面
4.判断session是否存在->否->判断cookies是否存在->否->跳转到login页面




你的流程貌似没有查询过数据库,很节约,但是存在漏洞问题:
1 假如账号在11点正常登录,12点账号被盗,密码被修改。可他还可以继续使用账号,和那个盗号者一起共同使用
2 假设用户密码已经发生修改,可他没有退出重新登录却可以继续使用该账号
3 更关键的不可控,假设用户在11点登陆,12点管理员封禁其账号,可他却还是可以继续使用,除非他退出重新登录一次。




我判断closeuser的部分在login之后进行。因为如果前面的步骤都不成功,就不需要调用closeuser判断了。

对了,有个位置漏说了,当session过期,然后把cookies写入session时。我会把这次操作的时间记录入db,作为用户的最后在线时间的。当判断上一次的最后在线时间比现在的超过10分钟,我会check一次closeuser的表,判断是否被屏蔽。如果被屏蔽,就跳到对应的信息提示页面。就是每10分钟会检查一次db吧。
判断session是否存在->否->判断cookies是否存在->是->判断cookies解密是否成功->是-> 把cookies写入session->通过

然后,每10分钟,检查一次

如果用户一直在操作页面 那SESSION设置了超时时间,到了时间 会失效吗?
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么查找字符串是第几位php怎么查找字符串是第几位Apr 22, 2022 pm 06:48 PM

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)