二、后台登陆login.php【dedecms后台源码分析】
<?php /** * 后台登陆 * * @version $Id: login.php 1 8:48 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 */ //引入公共的显示文件 目录路径 域名/include/common.inc.php require_once(dirname(__FILE__).'/../include/common.inc.php'); //引入管理员登陆类 目录路径 域名/include/userlogin.class.php require_once(DEDEINC.'/userlogin.class.php'); //判断$dopost是否为空 $dopost是点击提交的发送变量 if(empty($dopost)) $dopost = ''; //检测安装目录安全性 //判断是否安装dedecms //判断安装目录是否存在 if( is_dir(dirname(__FILE__).'/../install') ) { //如果安装之后的install_lock.txt文件不存在 if(!file_exists(dirname(__FILE__).'/../install/install_lock.txt') ) { //以写的方式打开install_lock.txt //如果无法写入则执行后面那一句 $fp = fopen(dirname(__FILE__).'/../install/install_lock.txt', 'w') or die('安装目录无写入权限,无法进行写入锁定文件,请安装完毕删除安装目录!'); //写入ok fwrite($fp,'ok'); //关闭文件 fclose($fp); } //为了防止未知安全性问题,强制禁用安装程序的文件 //判断安装的index.php存在 目录路径 域名/install/index.php if( file_exists("../install/index.php") ) { //rename() 函数重命名文件或目录。 /** * 若成功,则该函数返回 true。若失败,则返回 false。 * 语法 * rename(oldname,newname,context) * 参数 描述 * oldname 必需。规定要重命名的文件或目录。 * newname 必需。规定文件或目录的新名称。 * context 可选。规定文件句柄的环境。context 是可修改流的行为的一套选项。 */ //重命名 目录路径 域名/install/index.php 备份文件 域名/install/index.php.bak @rename("../install/index.php", "../install/index.php.bak"); } //判断安装的module-install.php存在 目录路径 域名/install/index.php if( file_exists("../install/module-install.php") ) { //重命名 目录路径 域名/install/module-install.php 备份文件 域名/install/module-install.php.ba @rename("../install/module-install.php", "../install/module-install.php.bak"); } //定义文件路径 目录路径 域名/install/index.html $fileindex = "../install/index.html"; //判断 文件路径文件是否存在 if( !file_exists($fileindex) ) { //用可写的方式打开文件 $fp = @fopen($fileindex,'w'); //写入dir fwrite($fp,'dir'); //关闭 fclose($fp); } } //更新服务器文件 目录路径 域名/data/admin/config_update.php require_once (DEDEDATA.'/admin/config_update.php'); //如果 $dopost=='showad' if ($dopost=='showad') { //引入登陆界面的广告 include('templets/login_ad.htm'); exit; } //检测后台目录是否更名 GetCurUrl() 获得当前的脚本网址 $cururl = GetCurUrl(); //匹配正则 进行正则表达式匹配。并且只匹配一次 /** * int preg_match( string pattern, string subject [, array matches [, int flags]] ) * 在 subject 字符串中搜索与pattern给出的正则表达式相匹配的内容。 * 如果提供了 matches,则其会被搜索的结果所填充。$matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推。 * flags 可以是下列标记: * PREG_OFFSET_CAPTURE如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其偏移量。本标记自PHP 4.3.0 起可用。 * flags 参数来自 PHP 4.3.0 起可用。 * preg_match() 返回 pattern 所匹配的次数。要么是 0 次(没有匹配)或 1 次,因为 preg_match() 在第一次匹配之后将停止搜索。如果出错 preg_match() 返回FALSE。 */ if(preg_match('/dede\/login/i',$cururl)) { $redmsg = '<div class=\'safe-tips\'>您的管理目录的名称中包含默认名称dede,建议在FTP里把它修改为其它名称,那样会更安全!</div>'; } else { $redmsg = ''; } //登录检测 $admindirs = explode('/',str_replace("\\",'/',dirname(__FILE__))); $admindir = $admindirs[count($admindirs)-1]; //以下是点击登陆按钮的时候执行的 if($dopost=='login') { $validate = empty($validate) ? '' : strtolower(trim($validate)); //获取验证码的session值 GetCkVdValue() $svali = strtolower(GetCkVdValue()); if(($validate=='' || $validate != $svali) && preg_match("/6/",$safe_gdopen)){ //php版本有bug时候执行 ResetVdValue(); ShowMsg('验证码不正确!','login.php',0,1000); exit; } else { //new一个登陆的对象 $cuserLogin = new userLogin($admindir); //判断userid和pwd不为空 if(!empty($userid) && !empty($pwd)) { //checkUser 检验用户是否正确 $res = $cuserLogin->checkUser($userid,$pwd); //success if($res==1) { // keepUser保持用户的会话状态 $cuserLogin->keepUser(); if(!empty($gotopage)) { ShowMsg('成功登录,正在转向管理管理主页!',$gotopage); exit(); } else { ShowMsg('成功登录,正在转向管理管理主页!',"index.php"); exit(); } } //error else if($res==-1) { ShowMsg('你的用户名不存在!',-1,0,1000); exit; } else { ShowMsg('你的密码错误!',-1,0,1000); exit; } } //password empty else { ShowMsg('用户和密码没填写完整!',-1,0,1000); exit; } } } //引入登陆模板 目录路径 域名/dede/templets/login.htm include('templets/login.htm');