日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

PHP 會(huì)話(session 時(shí)間設(shè)定)使用入門

 開啟美好每一天 2014-01-15

在PHP開發(fā)中對(duì)比起Cookie,Session 是存儲(chǔ)在服務(wù)器端的會(huì)話,相對(duì)安全,并且不像 Cookie 那樣有存儲(chǔ)長(zhǎng)度限制,本文簡(jiǎn)單介紹 Session

的使用。

  由于 Session 是以文本文件形式存儲(chǔ)在服務(wù)器端的,所以不怕客戶端修改 Session 內(nèi)容。實(shí)際上在服務(wù)器端的 Session 文件,PHP 自動(dòng)

修改 Session 文件的權(quán)限,只保留了系統(tǒng)讀和寫權(quán)限,而且不能通過(guò) ftp 修改,所以安全得多。PHPChina 開源社區(qū)門戶k%W%e2CY

   對(duì)于 Cookie 來(lái)說(shuō),假設(shè)我們要驗(yàn)證用戶是否登陸,就必須在 Cookie 中保存用戶名和密碼(可能是 md5 加密后字符串),并在每次請(qǐng)

求頁(yè)面的時(shí)候進(jìn)行驗(yàn)證。如果用戶名和密碼存儲(chǔ)在數(shù)據(jù)庫(kù),每次都要執(zhí)行一次數(shù)據(jù)庫(kù)查詢,給數(shù)據(jù)庫(kù)造成多余的負(fù)擔(dān)。因?yàn)槲覀儾⒉荒?只做一

次驗(yàn)證。為什么呢?因?yàn)榭蛻舳?Cookie 中的信息是有可能被修改的。假如你存儲(chǔ) $admin 變量來(lái)表示用戶是否登陸,$admin 為 true 的時(shí)候

表示登陸,為 false 的時(shí)候表示未登錄,在第一次通過(guò)驗(yàn)證后將 $admin 等于 true 存儲(chǔ)在 Cookie,下次就不用驗(yàn)證了,這樣對(duì)么?錯(cuò)了,

假如有人偽造一個(gè)值為 true 的 $admin 變量那不是就立即取的了管理權(quán)限么?非常的不安全。

   而 Session 就不同了,Session 是存儲(chǔ)在服務(wù)器端的,遠(yuǎn)程用戶沒(méi)辦法修改 Session 文件的內(nèi)容,因此我們可以單純存儲(chǔ)一個(gè) $admin

變量來(lái)判斷是否登陸,首次驗(yàn)證通過(guò)后設(shè)置 $admin 值為 true,以后判斷該值是否為 true,假如不是,轉(zhuǎn)入登陸界面,這樣就可以減少很多

數(shù)據(jù)庫(kù)操作了。而且可以減少每次為了驗(yàn)證 Cookie 而傳遞密碼的不安全性了(Session 驗(yàn)證只需要傳遞一次,假如你沒(méi)有使用 SSL 安全協(xié)議

的話)。即使密碼進(jìn)行了 md5 加密,也是很容易被截獲的。

  當(dāng)然使用 Session 還有很多優(yōu)點(diǎn),比如控制容易,可以按照用戶自定義存儲(chǔ)等(存儲(chǔ)于數(shù)據(jù)庫(kù))。我這里就不多說(shuō)了。

  Session 在 php.ini 是否需要設(shè)置呢?一般不需要的,因?yàn)椴⒉皇敲總€(gè)人都有修改 php.ini 的權(quán)限,默認(rèn) Session 的存放路徑是服務(wù)器

的系統(tǒng)臨時(shí)文件夾,我們可以自定義存放在自己的文件夾里,這個(gè)稍后我會(huì)介紹。

  開始介紹如何創(chuàng)建 Session。非常簡(jiǎn)單,真的。

  啟動(dòng) Session 會(huì)話,并創(chuàng)建一個(gè) $admin 變量:

<?php
// 啟動(dòng) Session
session_start();
// 聲明一個(gè)名為 admin 的變量,并賦空值。
$_SESSION["admin"] = null;

  如果你使用了 Seesion,或者該 PHP 文件要調(diào)用 Session 變量,那么就必須在調(diào)用 Session 之前啟動(dòng)它,使用 session_start() 函數(shù)

。其它都不需要你設(shè)置了a00-206 ,PHP 自動(dòng)完成 Session 文件的創(chuàng)建。

  執(zhí)行完這個(gè)程序后,我們可以到系統(tǒng)臨時(shí)文件夾找到這個(gè) Session 文件,一般文件名形如:sess_4c83638b3b0dbf65583181c2f89168ec,

后面是 32 位編碼后的隨機(jī)字符串。用編輯器打開它,看一下它的內(nèi)容:

  admin|N;

  一般該內(nèi)容是這樣的結(jié)構(gòu):

  變量名|類型:長(zhǎng)度:值;

  并用分號(hào)隔開每個(gè)變量。有些是可以省略的,比如長(zhǎng)度和類型。

  我們來(lái)看一下驗(yàn)證程序,假設(shè)數(shù)據(jù)庫(kù)存儲(chǔ)的是用戶名和 md5 加密后的密碼:

<?php

// 表單提交后...
$posts = $_POST;
// 清除一些空白符號(hào)
foreach ($posts as $key => $value)
{
$posts[$key] = trim($value);
}
$password = md5($posts["password"]);
$username = $posts["username"];

$query = "SELECT `username` FROM `user` WHERE `password` = '$password'";
// 取得查詢結(jié)果
$userInfo = $DB->getRow($query);

if (!empty($userInfo))
{
if ($userInfo["username"] == $username)
{
// 當(dāng)驗(yàn)證通過(guò)后,啟動(dòng) Session
session_start();
// 注冊(cè)登陸成功的 admin 變量,并賦值 true
$_SESSION["admin"] = true;
}
else
{
die("用戶名密碼錯(cuò)誤");
}
}
else
{
die("用戶名密碼錯(cuò)誤");

  我們?cè)谛枰脩趄?yàn)證的頁(yè)面啟動(dòng) Session,判斷是否登陸:

<?php
// 防止全局變量造成安全隱患
$admin = false;

// 啟動(dòng)會(huì)話,這步必不可少
session_start();

// 判斷是否登陸
if (isset($_SESSION["admin"]) && $_SESSION["admin"] === true)
{
echo "您已經(jīng)成功登陸";
}
else
{
// 驗(yàn)證失敗,將 $_SESSION["admin"] 置為 false
$_SESSION["admin"] = false;
die("您無(wú)權(quán)訪問(wèn)");
}

  是不是很簡(jiǎn)單呢?將 $_SESSION 看成是存儲(chǔ)在服務(wù)器端的數(shù)組即可,我們注冊(cè)的每一個(gè)變量都是數(shù)組的鍵,跟使用數(shù)組沒(méi)有什么分別。

  如果要登出系統(tǒng)怎么辦?銷毀 Session 即可。

<?php

session_start();
// 這種方法是將原來(lái)注冊(cè)的某個(gè)變量銷毀
unset($_SESSION["admin"]);
// 這種方法是銷毀整個(gè) Session 文件
session_destroy();

  Session 能否像 Cookie 那樣設(shè)置生存周期呢?有了 Session 是否就完全拋棄 Cookie 呢?我想說(shuō),結(jié)合 Cookie 來(lái)使用 Session  e20-040 9A0-041  才是

最方便的。

   Session 是如何來(lái)判斷客戶端用戶的呢?它是通過(guò) Session ID 來(lái)判斷的,什么是 Session ID,就是那個(gè) Session 文件的文件名,

Session ID 是隨機(jī)生成的,因此能保證唯一性和隨機(jī)性,確保 Session 的安全。一般如果沒(méi)有設(shè)置 Session 的生存周期,則 Session ID 存

儲(chǔ)在內(nèi)存中,關(guān)閉瀏覽器后該 ID 自動(dòng)注銷,重新請(qǐng)求該頁(yè)面后 ICDL-IT ,重新注冊(cè)一個(gè) Session ID。

  如果客戶端沒(méi)有禁用 Cookie,則 Cookie 在啟動(dòng) Session 會(huì)話的時(shí)候扮演的是存儲(chǔ) Session ID 和 Session 生存期的角色。

  我們來(lái)手動(dòng)設(shè)置 Session 的生存期:

<?php
session_start();
// 保存一天
$lifeTime = 24 * 3600;
setcookie(session_name(), session_id(), time() + $lifeTime, "/");

  其實(shí) Session 還提供了一個(gè)函數(shù) session_set_cookie_params(); 來(lái)設(shè)置 Session 的生存期的,該函數(shù)必須在 session_start() 函數(shù)調(diào)

用之前調(diào)用:

<?php

// 保存一天
$lifeTime = 24 * 3600;
session_set_cookie_params($lifeTime);
session_start();
$_SESSION["admin"] = true;
?>

  如果客戶端使用 IE 6.0 , session_set_cookie_params(); 函數(shù)設(shè)置 Cookie 會(huì)有些問(wèn)題,所以我們還是手動(dòng)調(diào)用 setcookie 函數(shù)來(lái)創(chuàng)

建 cookie。

   假設(shè)客戶端禁用 Cookie 怎么辦?沒(méi)辦法,所有生存周期都是瀏覽器進(jìn)程了,只要關(guān)閉瀏覽器,再次請(qǐng)求頁(yè)面又得重新注冊(cè) Session。那

么怎么傳遞 Session ID 呢?通過(guò) URL 或者通過(guò)隱藏表單來(lái)傳遞,PHP 會(huì)自動(dòng)將 Session ID 發(fā)送到 URL 上,URL 形如:

其中 URL 中的參數(shù) PHPSESSID 就是 Session ID了,我

們可以使用 $_GET 來(lái)獲取該值,從而實(shí)現(xiàn) Session ID 頁(yè)面間傳遞。

<?php

// 保存一天
$lifeTime = 24 * 3600;
// 取得當(dāng)前 Session 名,默認(rèn)為 PHPSESSID
$sessionName = session_name();
// 取得 Session ID
$sessionID = $_GET[$sessionName];
// 使用 session_id() 設(shè)置獲得的 Session ID
session_id($sessionID);

session_set_cookie_params($lifeTime);
session_start();
$_SESSION["admin"] = true;

  對(duì)于虛擬主機(jī)來(lái)說(shuō),如果所有用戶的 Session 都保存在系統(tǒng)臨時(shí)文件夾里,將給維護(hù)造成困難,而且降低了安全性,我們可以手動(dòng)設(shè)置

Session 文件的保存路徑,session_save_path()就提供了這樣一個(gè)功能。我們可以將 Session 存放目錄指向一個(gè)不能通過(guò) Web 方式訪問(wèn)的文

件夾,當(dāng)然,該文件夾必須具備可讀寫屬性。

<?php
// 設(shè)置一個(gè)存放目錄
$savePath = "./session_save_dir/";
// 保存一天
$lifeTime = 24 * 3600;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
$_SESSION["admin"] = true;

  同 session_set_cookie_params(); 函數(shù)一樣,session_save_path() 函數(shù)也必須在 session_start() 函數(shù)調(diào)用之前調(diào)用。

  我們還可以將數(shù)組,對(duì)象存儲(chǔ)在 Session 中。操作數(shù)組和操作一般變量沒(méi)有什么區(qū)別,而保存對(duì)象的話,PHP 會(huì)自動(dòng)對(duì)對(duì)象進(jìn)行序列化(

也叫串行化),然后保存于 Session 中。下面例子說(shuō)明了這一點(diǎn):

<?php
class person
{
var $age;
function output() {
echo $this->age;
}

function setAge($age) {
$this->age = $age;
}
}

setage.php
<?php
session_start();
require_once "person.php";
$person = new person();
$person->setAge(21);
$_SESSION['person'] = $person;
echo "<a href='output'>check here to output age</a>";

output.php
<?
// 設(shè)置回調(diào)函數(shù),確保重新構(gòu)建對(duì)象。
ini_set('unserialize_callback_func', 'mycallback');
function mycallback($classname) {
$classname . ".php";
}
session_start();
$person = $_SESSION["person"];
// 輸出 21
$person->output();

  當(dāng)我們執(zhí)行 setage.php 文件的時(shí)候,調(diào)用了 setage() 方法,設(shè)置了年齡為 21,并將該狀態(tài)序列化后保存在 Session 中(PHP 將自動(dòng)

完成這一轉(zhuǎn)換),當(dāng)轉(zhuǎn)到 output.php 后,要輸出這個(gè)值,就必須反序列化剛才保存的對(duì)象,又因?yàn)樵诮庑蛄谢臅r(shí)候需要實(shí)例化一個(gè)未定義

類,所以我們定義了以后回調(diào)函數(shù),自動(dòng)包含 person.php 這個(gè)類文件,因此對(duì)象被重構(gòu),并取得當(dāng)前 age 的值為 21,然后調(diào)用 output()

方法輸出該值。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多