作者mrbigmouth (拒绝崩溃的蒲公英)
看板PHP
标题Re: [请益] PHP的登入权限管理
时间Wed Jun 15 22:33:07 2011
※ 引述《thinklu (包子)》之铭言:
: 不好意思~我是PHP的初学者
: 我正在做login的东西~
: 在一开始我用:
: session_set_cookie_params(60);
: session_start();
: 来设定timeout时间
: 接着我做了:
: $_SESSION['un'] = $username;
: 来指派值~
: 之後log in成功~我跳到了另一个php档~
: 在一进去我就做了:
: if ( ! isset( $_SESSION['un'] ) ) {
: echo '<meta http-equiv=REFRESH CONTENT=3;url=login.php>';
: }
: 来确定使用者有log in~不然我就把他redirect出去
: 不好意思讲一堆~现在问题来了~
: 我想做:
: if(/*timeout happens*/) {
: echo '<meta http-equiv=REFRESH CONTENT=3;url=login.php>';
: }
: 可是我不知道/*timeout happens*/ 应该要写什麽~
: 可以请各位大大帮忙吗?
: 我有先找过一堆资料了~可是没有找到我想要的~
: 所以来这边问问看各位~肛温~
既然有问到「一般常见的Session登入怎麽做」
就借标题来分享(兼请教)一下
据我所知的常见登入/登出作法
是在每个需要帐号权限的页头都引入类似下面的检查档
<?php
session_start();
if (empty($_SESSION['Login'])){
header('Location:Login.php');
die();
}
?>
在登入页面登入成功时$_SESSION['Login']='使用者登入的ID';
登出时则unset($_SESSION['Login']);
以上是最简单的作法
但是最近需要用比较安全/保密的帐号登入管理
最好能够掌控每个帐号的登入时间、从哪登入、同一时间只能由一台电脑登入、
每次登入/取代时都会留下纪录、视使用者idle时间而定的timeout机制
目前的想法如下
同样在每个需权限页面档头引入检查档
但是不使用Session,而是使用expire time为0的Cookie为纪录
(在浏览器关掉後才会自动删除的Cookie)
每次使用者登入成功後,程式自动产生一段random code,
作为login token给使用者的浏览器cookie纪录
同时间,php会将此token码的产生时间与登入IP存入一个token资料表中
该资料表有以下栏位
token(随机字串),LoginTime(登入时间),ChangeTime(此token的最新活动时间),
LogOut(登出与否+登出方式),IP(此token所使用的IP)
检查页面差不多是以下结构
<?php
if (empty($_COOKIE['token'])){
//没有授权token,转向登入页面
header('Location:Login.php');
//若登入成功时,该帐号拥有其他未登出的token,则将其kick out
die();
}
else{
$TokenData=.... //从资料表中取出该Token的资料
if (不存在此token || token之IP与浏览者不符){
/*
将此浏览者IP与尝试时间存入错误资料表内
若短时间内某一IP尝试错误过多,则拒绝此IP连线
*/
die();
}
elseif (token已经登出或被kick out){
//显示相关错误讯息,并且请使用者重新登入
header('Location:Login.php');
die();
}
else {
//更新token的最新活动时间
}
}
?>
以上主要是抛砖引玉
希望有人有更好或差不多的作法可以分享、比对一下...XD
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.170.62.155
※ 编辑: mrbigmouth 来自: 218.170.62.155 (06/15 22:34)
1F:推 ousapas:有些更安全的好像会用user_agent和salt用md5加密 06/16 00:17
2F:→ ousapas:user_agent + ip + salt 06/16 00:17
3F:→ ousapas:每次都对照是否符合 06/16 00:18
4F:推 howar31:好棒 最近也在研究安全的登入管理方式 06/17 16:04
5F:推 kajane:codeigniter的sesssion类别似乎就是用ous大所说的方法写的 06/18 00:32