dedecms5.7(織夢)源碼解析以後臺登陸

前言

在安裝完成以後,咱們一般會進入後臺,那麼登陸天然是必不可少的一步,下面咱們就來看看,織夢的登陸在源碼中是究竟如何完成的吧。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

它的執行順序分別爲:網站

  1. 分別加載config.phpdedetag.class.php兩個文件ui

  2. 分別載入通用快捷菜單模板和當前用戶快捷菜單模板,該模板最終會顯示在登陸後的首頁的快捷操做欄中url

  3. 最後載入菜單地圖和首頁模板

到此爲止,你也許會問,那麼程序是在哪裏判斷登陸的呢?從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" />

總結

異曲同工,登陸無非就是判斷登陸狀態=》沒有登陸則跳轉到登陸頁面=》登陸了則跳轉到首頁,剩下的基本就是參數處理和表單驗證了,把握好核心,一切都能隨心。

相關文章
相關標籤/搜索