在安装完成以后,咱们一般会进入后台,那么登陆天然是必不可少的一步,下面咱们就来看看,织梦的登陆在源码中是究竟如何完成的吧。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" />
异曲同工,登陆无非就是判断登陆状态=》没有登陆则跳转到登陆页面=》登陆了则跳转到首页,剩下的基本就是参数处理和表单验证了,把握好核心,一切都能随心。