在安裝完成以後,咱們一般會進入後臺,那麼登陸天然是必不可少的一步,下面咱們就來看看,織夢的登陸在源碼中是究竟如何完成的吧。php
首先,若是咱們直接訪問域名/dede
,那麼程序走的確定是index.php,文件源碼以下:html
<?php /** * 管理後臺首頁 * * @version $Id: index.php 1 11:06 2010年7月13日Z tianya $ * @package DedeCMS.Administrator * @copyright Copyright (c) 2007 - 2010, DesDev, Inc. * @license http://help.dedecms.com/usersguide/license.html * @link http://www.dedecms.com */ require_once(dirname(__FILE__)."/config.php"); require_once(DEDEINC.'/dedetag.class.php'); $defaultIcoFile = DEDEDATA.'/admin/quickmenu.txt'; $myIcoFile = DEDEDATA.'/admin/quickmenu-'.$cuserLogin->getUserID().'.txt'; if(!file_exists($myIcoFile)) $myIcoFile = $defaultIcoFile; require(DEDEADMIN.'/inc/inc_menu_map.php'); include(DEDEADMIN.'/templets/index2.htm'); exit();
從源碼中不難看出,該頁面主要是起統領做用,包含了以下幾個文件:安全
/dede/config.php : 管理目錄配置文件服務器
/include/dedetag.class.php : 模板類ide
/dede/inc/inc_menu_map.php : 菜單地圖函數
/dede/templates/index2.html : 後臺首頁模板post
它的執行順序分別爲:網站
分別加載config.php
和dedetag.class.php
兩個文件ui
分別載入通用快捷菜單模板和當前用戶快捷菜單模板,該模板最終會顯示在登陸後的首頁的快捷操做欄中url
最後載入菜單地圖和首頁模板
到此爲止,你也許會問,那麼程序是在哪裏判斷登陸的呢?從index.php
中貌似也沒有看到關於登陸的地方啊,爲何我輸入index.php
而會直接跳轉到後面跟一堆參數的logo.php
呢?別急,其實它就在config.php
中,看下面源碼:
//得到當前腳本名稱,若是你的系統被禁用了$_SERVER變量,請自行更改這個選項 $dedeNowurl = $s_scriptName = ''; $isUrlOpen = @ini_get('allow_url_fopen'); $dedeNowurl = GetCurUrl(); $dedeNowurls = explode('?', $dedeNowurl); $s_scriptName = $dedeNowurls[0]; $cfg_remote_site = empty($cfg_remote_site)? 'N' : $cfg_remote_site; //檢驗用戶登陸狀態 $cuserLogin = new userLogin(); if($cuserLogin->getUserID()==-1) { header("location:login.php?gotopage=".urlencode($dedeNowurl)); exit(); }
在上面代碼中,程序首先獲取了當前的腳本網址以及對其盡心拆解處理,而後實例化織夢的登陸類,根據當前用戶id來判斷用戶是否登陸,若是沒有,則跳轉到login.php
,後面的一堆參數也就是以前的腳本網址urlencode
以後的結果。
好,既然到了login.php
了,那咱們就繼續來看看,在login.php
頁面中,是如何處理的吧。
login.php
文件源碼大概能夠分爲如下幾塊:
分別載入全局配置文件和登陸類
檢測安裝目錄安全性,若是沒有寫入鎖文件,這裏則再次寫入一次(雙保險),而後將兩個可執行的php文件修改備註爲php.bak
,使其失去可執行性,最後新增index.html
文件,內容爲dir,增長安全性,這一切都是爲了防止惡意用戶重複安裝,致使網站損壞。
//檢測安裝目錄安全性 if( is_dir(dirname(__FILE__).'/../install') ) { if(!file_exists(dirname(__FILE__).'/../install/install_lock.txt') ) { $fp = fopen(dirname(__FILE__).'/../install/install_lock.txt', 'w') or die('安裝目錄無寫入權限,沒法進行寫入鎖定文件,請安裝完畢刪除安裝目錄!'); fwrite($fp,'ok'); fclose($fp); } //爲了防止未知安全性問題,強制禁用安裝程序的文件 if( file_exists("../install/index.php") ) { @rename("../install/index.php", "../install/index.php.bak"); } if( file_exists("../install/module-install.php") ) { @rename("../install/module-install.php", "../install/module-install.php.bak"); } $fileindex = "../install/index.html"; if( !file_exists($fileindex) ) { $fp = @fopen($fileindex,'w'); fwrite($fp,'dir'); fclose($fp); } }
更新服務器
檢測後臺目錄是否改名,爲了安全性,若是檢測到沒有改名,則會提示
登陸檢測 : 這一步就是檢測驗證碼,用戶名,和密碼,成功後跳轉到首頁
包含登陸頁面模板
那麼,到此登陸就基本結束了,其中有兩個地方再說一下,一個是參數gotopage和另外一個dohost,這兩個參數或變量均在login.html中能夠找到,具體詳細流程你們可自行研究,關於gotopage,爲了安全性,在login.html中能夠看到,此處用了removeXSS函數,防止xxs攻擊:
<input type="hidden" name="gotopage" value="<?php if(!empty($gotopage)) echo RemoveXSS($gotopage);?>" /> <input type="hidden" name="dopost" value="login" />
異曲同工,登陸無非就是判斷登陸狀態=》沒有登陸則跳轉到登陸頁面=》登陸了則跳轉到首頁,剩下的基本就是參數處理和表單驗證了,把握好核心,一切都能隨心。