淺析phpwind9.0之cookies的生成機制解析(成功登陸後)
由於工作的需要,所以開始分析phpwind9.0論壇的部分功能的處理機制,這一節來分析cookies生成機制。
登陸頁面進入這裡:
進行處理,具體函式:
welcomeAction()
注意到這個函式的這一行:
$login->setLoginCookie($this->loginUser,$this->getRequest()->getClientIp(),$rememberme);
然後進入具體的處理細節,在
這裡,具體內容:(設定登陸cookies)
public function setLoginCookie(PwUserBo$userBo,$ip,$rememberme
……
/* @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.0之cookies的生成機制解析(成功登陸後)
由於工作的需要,所以開始分析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 ①.獲取資料及儲
Qt之JSON生成與解析
簡述 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.0之WebDriver的啟用IE10(IEDriverServer)
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手冊以及相關例程,不一會兒,一個多