1. 程式人生 > >淺析phpwind9.0之cookies的生成機制解析(成功登陸後)

淺析phpwind9.0之cookies的生成機制解析(成功登陸後)

由於工作的需要,所以開始分析phpwind9.0論壇的部分功能的處理機制,這一節來分析cookies生成機制。

登陸頁面進入這裡:

進行處理,具體函式:

welcomeAction()

注意到這個函式的這一行:

$login->setLoginCookie($this->loginUser,$this->getRequest()->getClientIp(),$rememberme);

然後進入具體的處理細節,在

這裡,具體內容:(設定登陸cookies)

    public function setLoginCookie(PwUserBo$userBo,$ip,$rememberme

=0) {

       ……

       /* @var $userServicePwUserService */

       $userService = Wekit::load('user.srv.PwUserService');

       $userService->createIdentity($userBo->uid,$userBo->info['password'],$rememberme);

       return $this->welcome($userBo,$ip);

    }

首先進入,載入該類,然後檢視

createIdentity成員函式:(建立登陸標識)

       public function createIdentity($uid, $password, $rememberme = 0) {

              $identity =Pw::encrypt($uid . "\t" . Pw::getPwdCode($password));

              return Pw::setCookie('winduser',$identity,$rememberme?31536000: NULL);

       }

到這裡可以看到和網上:

這篇文章裡面說的有點類似了(只可惜這個是7.3的,7.3存在一個問題,就是如果我使用的是https服務,而不是http服務,那麼前臺訪問就有問題,無法訪問,但是後臺可以)

這裡的getpwdcode函式在檔案裡,具體內容為:(密碼加密儲存$pwd就是通過使用者登陸後獲得的明文的密碼,經過該函式後形成密文的密碼

    public static function getPwdCode($pwd) {

       return md5($pwd. Wekit::C('site','hash'));

    }

引數中的Wekit::C('site', 'hash')為全站hash值,在程式安裝的過程中產生,可以在配置檔案()中找到,這樣就明白了createIdentity中的encrypt函式的其中的一個引數變數(Pw::getPwdCode($password))的具體值了。

再來看Pw::encrypt這個函式,具體在中,內容為:(加密方法)

    public static function encrypt($str,$key='') {

       $key || $key = Wekit::C('site', 'hash');

       /* @var $security IWindSecurity*/

       $security = Wind::getComponent('security');

       return base64_encode($security->encrypt($str,$key));

    }

在Wind::getComponent('security')這一行程式碼中,通過獲取實現IWindSecurity介面的元件來呼叫相應的成員函式,具體就是:這個檔案,他實現了該介面,成員函式encrypt的具體函式如下:

    public function encrypt($string,$key,$iv='') {

       if ($string==='')return'';

       if (!extension_loaded('mcrypt')) {

           throw new WindException('[security.WindMcryptCbc.encrypt]extension \'mcrypt\' is not loaded.');

       }

       if (!$key|| !is_string($key)) {

           throw new WindException('[security.WindMcryptCbc.encrypt]security key is required. ',

              WindException::ERROR_PARAMETER_TYPE_ERROR);

       }

       $size = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC);

       $iv = substr(md5($iv?$iv:$key), -$size);

       $pad = $size - (strlen($string) % $size);

       $string .= str_repeat(chr($pad),$pad);

       return mcrypt_cbc(MCRYPT_DES,$key,$string, MCRYPT_ENCRYPT,$iv);

    }

基本都是php的關於mcrpyt模組的內建函式,至此,該函式分析完畢。

當該函式執行完後,pw.php對該函式的返回結果進行base64_encode,然後將這個函式的返回結果作為最終的pw.php檔案中encrypt成員函式的最終返回值。

接著,我們回到的createIdentity成員函式:

       public function createIdentity($uid, $password, $rememberme = 0) {

              $identity =Pw::encrypt($uid . "\t" . Pw::getPwdCode($password));

              return Pw::setCookie('winduser',$identity,$rememberme?31536000: NULL);

       }

然後進入檔案中的setCookie成員函式,進行對cookies的設定工作:

    public static function setCookie($name,$value= null,$expires= null,$httponly=false) {

       $path = $domain = null;

       if ('AdminUser'!=$name) {

           $path = Wekit::C('site','cookie.path');

           $domain = Wekit::C('site','cookie.domain');

       }

       $pre = Wekit::C('site','cookie.pre');

       $pre && $name = $pre . '_' . $name;

       $expires && $expires += self::getTime();

       return WindCookie::set($name,$value,false,$expires,$path,$domain,false,$httponly);

    }

這個主要就是取得cookies的名字,其中有一個操作就是通過配置檔案取得cookies的字首,與傳入的cookies名字進行組合形成最終的cookies名,然後呼叫

該類的建構函式set:

    public static function set($name,$value= null,$encode=false,$expires= null,$path= null, $domain= null, $secure = false, $httponly = false) {

       if (empty($name))return false;

       $encode && $value && $value= base64_encode($value);

       $path = $path ? $path : '/';

       setcookie($name, $value, $expires, $path, $domain, $secure, $httponly);

       return true;

    }

利用php內建的setcookie函式來設定cookies值,這樣就形成了登陸後我們看到的最終的cookies值了。

沒有用流程圖一一的畫出來,其實涉及到的函式也並不多,大家看著在紙上畫一畫也就ok了,嘿嘿。

本文主要參考了

1.phpwind官方手冊:http://wiki.open.phpwind.com/index.php?title=%E9%A6%96%E9%A1%B5

2.Phpwind登入Cookie分析:http://blog.csdn.net/xxaqzy/article/details/4141219

轉載請註明出處:http://blog.csdn.net/jayxujia123/article/details/35780867

作者郵箱:[email protected]


相關推薦

淺析phpwind9.0cookies生成機制解析成功登陸

由於工作的需要,所以開始分析phpwind9.0論壇的部分功能的處理機制,這一節來分析cookies生成機制。 登陸頁面進入這裡: 進行處理,具體函式: welcomeAction() 注意到這個函式的這一行: $login->setLoginCookie($thi

Vczh Library++ 3.0可配置語法分析器FpMacro及程式碼

    上一篇文章基本上把分析的過程都講完了,於是這次就把FpMacro作為一個Demo拿了出來。不第一次就發的原因主要是那個時候FpMacro剛剛寫完,當然寫完就要用的,於是後來就在Vczh Library++ 3.0的庫裡面大量使用了FpMacro作為程式碼生成的一個工具,用來代替一部分的巨集

XML生成解析DOM、ElementTree

xml.dom篇     DOM是Document Object Model的簡稱,XML 文件的高階樹型表示。該模型並非只針對 Python,而是一種普通XML 模型。Python 的 DOM 包是基於 SAX 構建的,並且包括在 Python 2.0 的標準 XML 支援裡。 一、xml.dom的簡單

ARKit學習2.0基礎及案例解析後續再更新

 為了方便AR開發交流,博主建立了一個群 :891555732,歡迎一起討論 一.多人共享資料  官方案例原始碼 : https://github.com/Unity-Technologies/SharedSpheres ①.獲取資料及儲

QtJSON生成解析

簡述 Qt5 中包含了處理 JSON 的類,均以 QJson 開頭(例如:QJsonDocument、QJsonArray、QJsonObject),在 QtCore 模組中,不需要額外引入其它模組。 常用的 JSON 庫 json.org 中介紹了 JSON 在各種語

Qt JSON 生成解析

簡述 Qt5 中包含了處理 JSON 的類,均以 QJson 開頭(例如:QJsonDocument、QJsonArray、QJsonObject),在 QtCore 模組中,不需要額外引入其它模組。 | 常用的 JSON 庫 json.org 中介紹

時序數據庫連載系列: 時序數據庫一哥InfluxDB存儲機制解析

結構 過程 們的 相同 分片 報錯 情況下 什麽 上層 InfluxDB 的存儲機制解析本文介紹了InfluxDB對於時序數據的存儲/索引的設計。由於InfluxDB的集群版已在0.12版就不再開源,因此如無特殊說明,本文的介紹對象都是指 InfluxDB 單機版 Inf

Selenium2.0WebDriver的啟用IE10IEDriverServer

selenium bdr orm 路徑 選項 log 右鍵 launch imp 如圖 代碼: package org.coderinfo.demo; import org.openqa.selenium.WebDriver; import org.openqa.sele

以前寫的兩本書《安全路:Web滲透技術及實戰案例解析第2版》和《黑客攻防實戰加密與解密》

Web滲透技術及實戰案例解析 黑客攻防實戰加密與解密 應一些朋友的要求,我重新將書封面和購買地址發一下說明一下:www.antian365.com原來域名轉移到國外去了。現在國家對境外域名在國內訪問必須實名制,進行備份啥的,情況你懂的。最近正在制作《黑客攻防實戰加密與解密》的視頻課程,對黑客攻防過程遇

Kafka設計解析二十二Flink + Kafka 0.11端到端精確一次處理語義的實現

pac 內部 通知 發生 ng- 設計 解析 位移 eas 轉載自 huxihx,原文鏈接 【譯】Flink + Kafka 0.11端到端精確一次處理語義的實現 本文是翻譯作品,作者是Piotr Nowojski和Michael Winters。前者是該方案的實現

mybatis原始碼-Mapper解析SQL 語句節點解析一條語句對應一個MappedStatement)

一起學 mybatis 你想不想來學習 mybatis? 學習其使用和原始碼呢?那麼, 在部落格園關注我吧!! 我自己打算把這個原始碼系列更新完畢, 同時會更新相應的註釋。快去 star 吧!! mybatis最新原始碼和註釋 在 mybatis 中, 對應 CRUD 的是四種節點: <

scala-val物件例項化變數卻可以更改深度解析小白適用

類和物件可能都很熟悉了,這裡僅供小白參考,大神請虐過。一開始學的時候物件是類的藍圖,啥,藍圖,什麼鬼?我們直接看程式碼吧~ import scala.io.Source class ChecksumAccumulator(){ var sum = 0 }

Linux系統入門命令學習及解析

Linux常用目錄 以下是系統的一級目錄,這些目錄在Linux系統中都有著不同的用處。 /  Linux系統根目錄(重要,常用) /home  包含使用者的檔案:引數設定、個性檔案、文件、資料、EMAIL、快取資料等,每增加一個使用者,系統就會在home目錄下

Vczh Library++3.0可配置語法分析器分析Demo:函式式巨集

    上一篇文章提到了我開發了可配置語法分析器之後做了一個FpMacro用來生成C++有規律的程式碼。這一篇文章就從FpMacro入手,分析可配置語法分析器所需要具備的功能。首先讓我們來了解一下什麼是FpMacro。    FpMacro主要用來產生用C++巨集很難容易產生的程式碼(譬如BOOS

kafka系列broker重點配置解析

kafka broker 配置 對應kafka安裝目錄config/server.properties檔案的配置 broker.id 每一個Kafka的broker都有一個整數的標識。我們設定broker.id來標識它。預設這個整數是0。這

Android總結json解析FastJson Gson 對比

前言: 最近為了統一專案中使用的框架,發現專案中用到了兩種json解析框架,他們就是當今非常主流的json解析框架:google的Gson 和阿里巴巴的FastJson,為了廢除其中一個所以來個效能和使用的大比拼。 FastJson簡介:Fastjson是一個Java語言編寫的JSON處理器,由阿里巴巴公

C#上位機制串列埠接受資料利用接受事件

前面設計好了介面,現在就開始寫程式碼了,首先定義一個串列埠物件..SerialPort serialport = new SerialPort();//定義串列埠物件新增串列埠掃描函式,掃描出來所有可用串列埠顯示在下拉框中,同時設定接受函式string[] ArryPort

android permission許可權與安全機制解析

  剛建了一個QQ群,感興趣的大家一起多多交流:544645972   在android permission許可權與安全機制解析(上)篇部落格中,我已經詳細介紹了android相關係統permission和自定義permission,以及一些許可權機制和安全

android permission許可權與安全機制解析

  總結整理了一下android許可權相關的知識,由於篇幅過長,分為兩篇部落格來寫,上篇部落格主要是詳解許可權和安全,下篇主要是介紹android6.0許可權適配問題:   android permission許可權與安全機制解析(下) uses-per

Java NIO類庫Selector機制解析

在使用Java進行相關網路程式的的設計時,出身C/C++的人,首先想到的框架就是多路複用,想到多路複用,Unix/Linux下馬上就能讓從想到select, poll, epoll系統呼叫。於是,在看到Java的NIO中的Selector類時必然會倍感親切。稍加查閱一下SDK手冊以及相關例程,不一會兒,一個多