乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

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

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

      的使用。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        啟動(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):

        變量名|類型:長度:值;

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

        我們來看一下驗(yàn)證程序,假設(shè)數(shù)據(jù)庫存儲(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)證通過后,啟動(dòng) Session
      session_start();
      // 注冊登陸成功的 admin 變量,并賦值 true
      $_SESSION["admin"] = true;
      }
      else
      {
      die("用戶名密碼錯(cuò)誤");
      }
      }
      else
      {
      die("用戶名密碼錯(cuò)誤");

        我們在需要用戶驗(yàn)證的頁面啟動(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("您無權(quán)訪問");
      }

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

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

      <?php

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

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

      最方便的。

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

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

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

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

        我們來手動(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(); 來設(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ì)有些問題,所以我們還是手動(dòng)調(diào)用 setcookie 函數(shù)來創(chuàng)

      建 cookie。

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

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

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

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

      <?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;

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

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

      件夾,當(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ù)組,對象存儲(chǔ)在 Session 中。操作數(shù)組和操作一般變量沒有什么區(qū)別,而保存對象的話,PHP 會(huì)自動(dòng)對對象進(jìn)行序列化(

      也叫串行化),然后保存于 Session 中。下面例子說明了這一點(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)建對象。
      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è)值,就必須反序列化剛才保存的對象,又因?yàn)樵诮庑蛄谢臅r(shí)候需要實(shí)例化一個(gè)未定義

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

      方法輸出該值。

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多