作者 主題: 討論討論...關於PHP+Mysql 在設計網站時的使用者認證  (閱讀 9962 次)

0 會員 與 1 訪客 正在閱讀本文。

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
大家用的是什麼方式呢?

先把我的方式跟大家討論看看

我的使用者資料表重點在於“ID、pwd、session、IP”這四個
我的認證方式採二大部份
一個就是ID跟pwd,這是一般最容易使用的方式了
只要帳號、密碼正確,就可以持續的使用
不過想到一個問題,就是“盜用”

我如何確定,目前使用者只是唯一登入?
不會有第二個人同時在使用這個帳號呢?

我是利用session_id()能記錄一個唯一值的特性
如果下一次使用網頁(不是登入喔,是只要進網頁)
就查驗這個ID、Password、Session_ID、IP值在資料庫
session_ID的值是否相同
當然,password都是用加密後的字串...
如果不相同就取消驗證的方式
這是為了我不清楚有沒有人能“冒用session_ID值” ><
而IP只要是“使用NAT就完全一樣了”
因此我不傾向只紀錄其中一個資料。

而只有“登入時使用正確的帳號、密碼”的人才能取的“正確的session_ID”
這樣子就比較不用擔心被擔用..

而在登入的時候,在用一個如果密碼錯誤就另外做成一份紀錄

應該就算有點完整的認證機制了吧?

其它在寫網頁認證機制會用什麼方式呢?[/quote]

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
把我的程式碼給大家參考看看...
不過這份程式碼比較舊一點點
可能有些部份我還沒實作 ><  :p 最近太懶啦 呵
代碼: [選擇]

if ($username){
        $session_r = mysql_fetch_array(mysql_query("select pwd,session from User where ID = '$username'"));
        if ($session_r[1] != session_id()){ session_destroy();$username="";$passwd=""; };
};


代碼: [選擇]
if ($Login == '登出'){
mysql_query("update UserData set session='loguot' where ID = '$S_userID'");
session_destroy();
unset($S_username,$S_userID,$S_session);
};

if ($Login == '登入'){
        if (isset($L_pwd)){
                $pwd_query = mysql_query("select password('$L_pwd')");
                $pwd_r = mysql_fetch_array($pwd_query);
                $query = mysql_query("select pwd from UserData where ID='$L_ID'");
                $r = mysql_fetch_array($query);
                if ($r[0] == $pwd_r[0]){
                        $UserName_query = mysql_query("select SN,name,E_mail from UserData where ID='$L_ID'");
                        $r_username = mysql_fetch_array($UserName_query);
                        $S_username = $r_username[1];
                        $S_userID = $L_ID;
                        $S_userSN = $r_username[0];
                        $S_session = session_id();
                        mysql_query("update UserData set session='$S_session' where ID='$S_userID'");
                        mysql_query("update UserData set date=now() where ID='$S_userID'");
                        $error_msg = '正確登入';
                }
        }
}

還有 我的程式寫的很醜啦...
不要扁我啦...[/code]

lkkl

  • 活潑的大學生
  • ***
  • 文章數: 431
    • 檢視個人資料
    • 我的線上小窩
我本來也想用自動sessio,可是用自動session會增加網頁9%的負擔(每個網頁都會窩),我只用cookie來認證(但瀏覽器也得開cookie),改寫網址又不能一次登入,沒辦法又要馬兒肥又要馬兒不吃草是不可能的,魚與熊掌不可兼得,不然就要3種都寫
愛護地球請用LINUX,省電又環保,大家共同為地球盡一份心力.
小弟的網頁
http://yplin123.googlepages.com/home
"資訊人權貴" 之家(令人佩服的洪朝貴老師)
http://people.ofset.org/~ckhung/

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
引述: "lkkl"
我本來也想用自動sessio,可是用自動session會增加網頁9%的負擔(每個網頁都會窩),我只用cookie來認證(但瀏覽器也得開cookie),改寫網址又不能一次登入,沒辦法又要馬兒肥又要馬兒不吃草是不可能的,魚與熊掌不可兼得,不然就要3種都寫


會選擇Session的原因之一是因為
session資訊是儲存在server而不是在client
我老覺得,留份資料在client的做法,會讓我怕怕的 ><

lkkl

  • 活潑的大學生
  • ***
  • 文章數: 431
    • 檢視個人資料
    • 我的線上小窩
恩恩
就是因為自動session是存在server每開一個網頁,server就增加開那一頁9%的負擔,人少的網站是沒差,人多的網站就會差很多,可是目前好像沒比session更好的認證方式了,不知有沒有更好的方式
愛護地球請用LINUX,省電又環保,大家共同為地球盡一份心力.
小弟的網頁
http://yplin123.googlepages.com/home
"資訊人權貴" 之家(令人佩服的洪朝貴老師)
http://people.ofset.org/~ckhung/

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
引述: "lkkl"
恩恩
就是因為自動session是存在server每開一個網頁,server就增加開那一頁9%的負擔,人少的網站是沒差,人多的網站就會差很多,可是目前好像沒比session更好的認證方式了,不知有沒有更好的方式


不過這9%的數據是從那裡來的呢?@@ 有點好奇...

lkkl

  • 活潑的大學生
  • ***
  • 文章數: 431
    • 檢視個人資料
    • 我的線上小窩
麥格羅.希爾的PHP4應用程式有提到使用自動傳遞的session會增加網頁9%的負擔
,說錯可別罵我!!
愛護地球請用LINUX,省電又環保,大家共同為地球盡一份心力.
小弟的網頁
http://yplin123.googlepages.com/home
"資訊人權貴" 之家(令人佩服的洪朝貴老師)
http://people.ofset.org/~ckhung/

paulso

  • 俺是博士!
  • *****
  • 文章數: 1966
    • 檢視個人資料
唉~ 多麼嚴密的保安也會有機會被入侵, 真是...

roder

  • 懷疑的國中生
  • **
  • 文章數: 48
    • 檢視個人資料
使用SESSION和COOKIE我認為都可以...我自己是用SESSION較多
重點在於使用者的習慣問題,因為USER註冊完就很少更新密碼
造成帳號容易被竊取,或是被暴力破解法得到
因此可以參考一些銀行網站的作法....

當USER註冊完後每1各月或3各月一次系統會硬性規定USER要更換密碼
如果不更換密碼便無法使用會員該有的服務,這點作法不錯..
但是USER可能會很煩... :o
並且登入後如果10分鐘沒動作系統直接砍掉USER的SESSION

不過這樣的作法都是在安全性要求較高的網站才會這樣做的...

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
引述: "roder"
當USER註冊完後每1各月或3各月一次系統會硬性規定USER要更換密碼
如果不更換密碼便無法使用會員該有的服務,這點作法不錯..
但是USER可能會很煩... :o
並且登入後如果10分鐘沒動作系統直接砍掉USER的SESSION

不過這樣的作法都是在安全性要求較高的網站才會這樣做的...


我自己的經驗
每一個月或3個月更新密碼
最新會有一張3M的黃色小紙條貼在營幕上 @@

甚至,我就是不來你的站了,如何?

倒是“密碼錯誤三次,由系統管理員重設”
我覺得比較實用一點..

如果單就實作方面roder大大會用什麼方式做呢?

我本來的想法是,只要不是被竊取到連線就好了
也就是 本來是A 在用,結果B利用了這些在傳遞的資料
取代了A的身份

paulso

  • 俺是博士!
  • *****
  • 文章數: 1966
    • 檢視個人資料
梁楓兄, 你用的是, 在database開一個user的table, 有一個column叫session嗎?用來記下user的logging狀態, 已登入, 登出這樣嗎?

我只是用session variable, register一個variable。用session_is_registered這個function check 有沒有define這個variable, if yes, 內裏有username, 即login了, if 沒有define這var, 即還沒login。after login, 就會session_register("username");$username = $loginname;

我那個就是這樣做, 很簡單。好像不太安全似的...

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
引述: "paulso"
梁楓兄, 你用的是, 在database開一個user的table, 有一個column叫session嗎?用來記下user的logging狀態, 已登入, 登出這樣嗎?

我只是用session variable, register一個variable。用session_is_registered這個function check 有沒有define這個variable, if yes, 內裏有username, 即login了, if 沒有define這var, 即還沒login。after login, 就會session_register("username");$username = $loginname;

我那個就是這樣做, 很簡單。


我會確認
1. UserName 有沒有值(權限判斷的根據)
2. 有值 -> 檢查密碼是否相符
3. 密碼相符->現有IP、session是否與資料庫中“登入使用者”的資料相符
4. 通關

其中一個不相符,都會讓User連線資料清空

因為我認為,IP、session都可能可以有另一個人一模一樣...
所以我的機制做的比較多...

不過 >< 我也不確定這樣安不安全...
有人能給點意件嗎?

roder

  • 懷疑的國中生
  • **
  • 文章數: 48
    • 檢視個人資料
說到作法...我以前都用比較懶惰的作法 :oops:
以前在只有PHP3時我都用PHPLIB來做使用者認證
PHPLIB基本上他用COOKIE的方式來模擬SESSION
使用MD5(uniqid($test))來產生一組唯一的值
並把每個使用者一進來網站的SESSION記錄到MYSQL中
最多自己只要寫各小程式在CRONTAB固定每天砍掉一些舊的SESSION值即可
我這裡提到的SESSION都是指PHPLIB用COOKIE模擬出來的
因此這方法比較不會有已經在網站某個USER的帳號被另一個USER竊取的問題
雖然PHP4裡面以提供SESSION了,但到現在我仍覺得PHPLIB還是很好用

PS:PHPLIB裡面還可以設定SESSION的生命週期以及可不可以允許CACHE等...

粱楓兄有興趣可以參考PHPLIB的作法... :D
http://www.sanisoft.com/phplib

paulso

  • 俺是博士!
  • *****
  • 文章數: 1966
    • 檢視個人資料
拜托拜托一大問題...

假若有個table, record:

id(primary key) | some data | logging user

1                        00100          user1
2                        11001          nouser

假若一個record只可一個user log了入去才可config, 別的user就要等待那user出來才可config data。
eg user1 log入了1, 將00100改做00110, 此時1的logging user是user1, 當其他user想入1 edit那data, 因為看倒1那column有user1, 所以進不倒來。當user1 press了logout之後, logging user in 1會寫做nouser, other user can access 1。
但假若user1改完後不press logout, 按"x"出了那page(.php), 這時在table的1內的loggin user是user1, 因為實際上user1已經走了(不正常地), 那麼就永遠都不能再login?how to solve it?

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
在程式裡做個判斷
在User的table做出一個“最後動作時間”
依上面的方式而言
User每一次啟動一個網頁(包含從A跳到B)
都需要在次的啟動認證機制
這樣的話
如果“最後動作時間”超過如十分鐘
那就可以開放重新登入

這個方式不知是否可行?

paulso

  • 俺是博士!
  • *****
  • 文章數: 1966
    • 檢視個人資料
引述: "梁楓"
在程式裡做個判斷
在User的table做出一個“最後動作時間”
依上面的方式而言
User每一次啟動一個網頁(包含從A跳到B)
都需要在次的啟動認證機制
這樣的話
如果“最後動作時間”超過如十分鐘
那就可以開放重新登入

這個方式不知是否可行?


這個可行哦~
但若果十分鐘內沒config完的話, user1會被第二個user強制性迫走。

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
引述: "paulso"
引述: "梁楓"
在程式裡做個判斷
在User的table做出一個“最後動作時間”
依上面的方式而言
User每一次啟動一個網頁(包含從A跳到B)
都需要在次的啟動認證機制
這樣的話
如果“最後動作時間”超過如十分鐘
那就可以開放重新登入

這個方式不知是否可行?


這個可行哦~
但若果十分鐘內沒config完的話, user1會被第二個user強制性迫走。


如果沒有logout,那在十分鐘內不允許login而己
這個我倒覺得還好

paulso

  • 俺是博士!
  • *****
  • 文章數: 1966
    • 檢視個人資料
這個方法不錯。除了這個方法我想不倒別的。

dwj

  • 可愛的小學生
  • *
  • 文章數: 3
    • 檢視個人資料
引述: "梁楓"
在程式裡做個判斷
在User的table做出一個“最後動作時間”
依上面的方式而言
User每一次啟動一個網頁(包含從A跳到B)
都需要在次的啟動認證機制
這樣的話
如果“最後動作時間”超過如十分鐘
那就可以開放重新登入

這個方式不知是否可行?


請善用 javascript event 和 php session timeout 機制.

amber6460

  • 懷疑的國中生
  • **
  • 文章數: 45
    • 檢視個人資料
為什麼不管我按幾次refresh count都是1呢??
« 回覆 #19 於: 2003-01-30 12:57 »
不管我按幾次的refresh count或 按聯結 還是count還是1呀??

<?php
if (!session_is_registered('count')) {
    session_register('count');
    $count = 1;
}
else {
    $count++;
}
?>

Hello visitor, you have seen this page <?php echo $count; ?> times.<p>

To continue, <A HREF="nextpage.php?<?php echo SID?>">click here</A>

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
Re: 為什麼不管我按幾次refresh count都是1呢??
« 回覆 #20 於: 2003-01-30 17:12 »
代碼: [選擇]
<?php
session_start
&#40;&#41;;
if &#40;!session_is_registered&#40;'count'&#41;&#41; &#123;
    
session_register&#40;'count'&#41;;
    
$count 1;
&
#125;
else &#123;
    
$count++;
&
#125;
?>


Hello visitor, you have seen this page <?php echo $count?> times.<p>

To continue, <A HREF="nextpage.php?<?php echo SID?>">click here</A>