Re: [請益] PHP的登入權限管理

看板PHP作者 (拒絕崩潰的蒲公英)時間14年前 (2011/06/15 22:33), 編輯推噓3(302)
留言5則, 3人參與, 最新討論串1/1
※ 引述《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)

06/16 00:17, , 1F
有些更安全的好像會用user_agent和salt用md5加密
06/16 00:17, 1F

06/16 00:17, , 2F
user_agent + ip + salt
06/16 00:17, 2F

06/16 00:18, , 3F
每次都對照是否符合
06/16 00:18, 3F

06/17 16:04, , 4F
好棒 最近也在研究安全的登入管理方式
06/17 16:04, 4F

06/18 00:32, , 5F
codeigniter的sesssion類別似乎就是用ous大所說的方法寫的
06/18 00:32, 5F
文章代碼(AID): #1D-CAcwA (PHP)
文章代碼(AID): #1D-CAcwA (PHP)