PHP程式設計 Cookie & Session 建國技術學院 資訊管理學系 饒瑞佶
PHP Cookie
Cookie 將少量資料儲存(by檔案)在遠端個人電腦的技術。 C:\Documents and Settings\電腦帳號\Cookies (Windows NT/2000/XP) 或 C:\Documents and Settings\帳號\Local Settings\Temporary Internet Files\ Cookie 的檔案名稱「可能」 是: tceb@km.tceb.edu[1].txt (就是 主機使用者帳號@網址.txt ) 它的內容可能是: phpbb2km_data (cookie 名稱) s%3A0%3A%22%22%3B (cookie 值) km.tceb.edu.tw/ (cookie 網域及路徑) 1536 16956672 29648268 4116192768 29574842 *
Cookie 使用者可以設定拒絕。 哪個瀏覽器設定的cookie,只能在該瀏覽器使用。 以IE為例 [工具] [Internet選項] [隱私]
Cookie的限制 每個使用者的瀏覽器只能支援(存取)300個Cookie 每個Cookie的大小最多僅4k Bytes的容量
Cookie的存取 設定: boolean setcookie (變數名,值,有效時間,路徑,領域,安全性) Setcookie(“A”, 10); Setcookie(“B”,”20”,time()+3600); Setcookie(“C”,”hello”,time()+7200,”./test/”,”abc.def.tw”,1); 必須在任何輸出前設定cookie 取出: $_COOKIE陣列 範例18-1 + 18-2
Cookie的存取 哪個瀏覽器設定的cookie,只能在該瀏覽器使用。否則要設定有效時間。 time()+3600 mktime(時,分,秒,月,日,年) 可以用來刪除cookie 範例18-4
PHP Session
Session 將資料儲存在伺服器的技術。 檔案位置 Session是將使用者資訊儲存在Server 端暫存檔中,儲存的位置是依照 php.ini 的設定: session.save_path = /tmp Session 的檔案名稱「可能」是 : sess_3dd484f2bab6a2d2509e9850dae3b897 (就是 sess_ 開頭,加上 32字元的亂數雜湊編碼所組成的檔名) 它的內容可能是: check|s:3:"yes";var1|s:1:"4";var2|s:1:"5"; 其實PHP的Session內容就是「變數名稱|變數類型:長度:內容;」的組合
Session 每次連線都有一個session id 要啟動才可以使用。 php.ini中的session.auto_start參數需設定為1 針對$_SESSION、$HTTP_SESSION_VARS而言 Session_start() 變數需要先註冊 Session_register(變數名) Session_unregister(變數名) $_SESSION陣列存取 所有的session放在session.save_path目錄中(php.ini) 範例18-5, 18-6
Session 使用Session時,有三個程序: 第一:啟動session功能 ─ 使用 session_start( ) 函數 第二:註冊session變數 ─ 使用 session_register( ) 函數 (或用$_SESSION、$HTTP_SESSION_VARS ) 第三:清除session變數或檔案 ─ 使用 session_unregister( )或 session_destroy( )函數 取得 session 的id值(與session檔案名稱,就是sess_後面接的32字元) ─ 使用 session_id ( )函數 查看要傳遞的變數是否已被註冊 ─ 使用 session_is_registerd( ) 函數
Session register <?php /*註冊session的變數名稱 abc,並將值置入。注意,在session_register( ) 函數內,註冊的是名稱的「字串」,不用加「$」。 */ $abc = "最原始的方法"; session_register("abc"); //這是利用所謂_SESSION方式註冊變數名稱「 xyz 」及值。 $_SESSION["xyz"] = "第二種方法"; //這是利用所謂HTTP_SESSION_VARS方式註冊變數名稱「 third 」及值。 $HTTP_SESSION_VARS["third"] = "第三種方法"; ?> 請特別注意,如果在session_register( )函數前沒有使用 session_start( )來啟動時,會自動呼叫 session_start( );而 $_SESSION 及 $HTTP_SESSION_VARS 方式並不會呼叫 ,須在使用前事先 session_start( ) 才有作用。
Session unregister <?php session_start( ); session_unregister("abc"); //假設 $abc = "123“ ?> 注意:須先啟動session_start( )函數才可正常清除。
Session傳遞 (共用) 透過URLs (網址?PHPSESSID=3dd484f2bab6a2d2509e9850dae3b897) 如果php.ini將「session.use_trans_sid」設定為「0」 透過Cookie php.ini有將「session.use_trans_sid」設定為「1」
Session傳遞 aa.php <?php session_start(); //啟動 session echo '>>第一頁<<'; $_SESSION['color'] = '藍色'; $_SESSION['city'] = '台中市'; $_SESSION['time'] = date("Y年m月d日 H時i分s秒"); // 連結另一個php程式, // 如果可以使用 cookie方式, //注意這裡用單引號 echo '<br /><a href=“bb.php">第二頁(cookie)</a>'; // 如果需用利用url方式傳遞 echo '<br /><a href=“bb.php?'.SID. '">第二頁(URLs)</a>'; ?>
Session傳遞 bb.php <?php session_start(); echo '>>第二頁<< <br />'; echo $_SESSION['color']."<br>"; echo $_SESSION['city']."<br>"; echo date("Y年m月d日 H時i分s秒")." ==> ".$_SESSION['time']; // 如果需用傳遞回第一頁 echo '<br /><a href=“aa.php?'. SID . '">第一頁</a>'; ?>
Session destroy <?php //啟動session session_start( ); /*清除session檔裡所有的資料; 如果要使用session_destroy( )函數,這動作可有可無。 */ session_unset( ); //刪除session檔 session_destroy( ); ?> 注意:須先啟動session_start( )函數才可正常運作。
安全性 在使用者登入時,在session資訊中即加入使用者的IP,然後再不同程式啟動session的同時,也連帶檢查是否來自同一個IP,如果發現不同時,就拒絕使用,並立即刪除這個session的檔案。
安全性 Ch17-4-1.php <?php session_start(); //啟動 session echo ">>> 第 一 頁 <<< <br />"; if ( !empty($_SERVER["HTTP_X_FORWARDED_FOR"]) ) { echo "有經過期他代理主機:".$_SERVER["HTTP_X_FORWARDED_FOR"]; $temp_ip = split(",", $_SERVER["HTTP_X_FORWARDED_FOR"]); $user_ip = $temp_ip[0]; } else { $user_ip = $_SERVER["REMOTE_ADDR"]; } echo "<br /? 使用者IP : $user_ip "; session_register ("user_ip"); //注意這裡用單引號 echo '<br /><a href="ch17-4-2.php?'.SID.'">第二頁</a>'; ?>
安全性 Ch17-4-2.php <?php session_start(); //啟動 session echo ">>> 第 二 頁 <<< <br />"; if ( !empty($_SERVER["HTTP_X_FORWARDED_FOR"]) ) { $temp_ip = split(",", $_SERVER["HTTP_X_FORWARDED_FOR"]); $user2_ip = $temp_ip[0]; } else { $user2_ip = $_SERVER["REMOTE_ADDR"]; } echo "<BR />原來session的IP:".$_SESSION["user_ip"]; echo "<br />目前使用者IP : $user2_ip "; if ( $_SESSION["user_ip"] != $user2_ip ) { echo "您不是原來登入的IP,請正常登入!!<br>"; session_destroy (); } else { echo "OK! <br />"; } //注意這裡用單引號 echo '<br /><a href="ch7-4-1.php">第一頁</a>'; ?>