文件位置
login.php 文件通常位于织梦后台的根目录下,路径为:
/dede/login.php

(图片来源网络,侵删)
核心功能流程
login.php 的执行流程非常清晰,主要可以分为以下几个步骤:
- 初始化环境:加载必要的系统配置和库文件。
- 处理登录请求:判断用户是否提交了登录表单。
- 验证用户信息:核对用户名、密码和验证码。
- 生成登录凭证:验证通过后,在服务器端创建Session,并记录用户信息。
- 页面跳转:跳转到后台管理首页。
- 显示登录页面:如果未登录或登录失败,则显示登录表单。
代码结构详解
下面我们结合代码片段来详细解析每个步骤。
初始化环境
文件开头会包含并初始化系统核心文件。
<?php
require_once(dirname(__FILE__).'/config.php');
require_once(DEDEINC.'/datalistcp.class.php');
require_once(DEDEINC.'/userlogin.class.php');
require_once(DEDEINC.'/common.func.php');
require_once(DEDEINC.'/charset.func.php');
require_once(DEDEADMIN.'/inc/inc_fun_funAdmin.php');
// 检测PHP版本,织梦通常要求PHP 5.4+
if (PHP_VERSION < '5.4.0')
{
exit('您的PHP版本过低,有安全隐患,请升级到PHP5.4及以上版本');
}
// 引入后台框架
require_once(DEDEINC.'/dedetemplate.class.php');
require_once(DEDEADMIN.'/inc/inc_archives_functions.php');
config.php: 加载网站的全局配置,如数据库连接信息、网站路径等。userlogin.class.php: 核心类,包含了用户登录、登出、Session管理等所有方法。charset.func.php: 处理字符集相关的函数。inc_fun_funAdmin.php: 包含一些后台管理常用的辅助函数。
处理登录请求
这是 login.php 的核心逻辑部分,它会检查 dopost 参数,判断用户是请求登录还是登出。

(图片来源网络,侵删)
// 检查是否已经登录,如果已登录则直接跳转到首页
if($cuserLogin->getUserID() != -1)
{
header("location:index.php");
exit();
}
// 处理登录请求
if(empty($dopost))
{
$dopost = '';
}
// 处理登出请求
if($dopost=='exit')
{
$cuserLogin->exitUser(); // 调用userlogin类的方法清除Session
header("location:login.php");
exit();
}
// 处理登录验证
else if($dopost=='login')
{
// ... 验证逻辑 ...
}
验证用户信息
当 dopost 为 login 时,执行登录验证。
else if($dopost=='login')
{
// 获取并清理提交的表单数据
$userid = preg_replace("#[^0-9A-Za-z_]#i", '', $userid);
$pwd = preg_replace("#[^0-9A-Za-z_\-]#i", '', $pwd);
// 1. 验证码校验
if(strtolower($vdcode)!=$svali || $vdcode=='')
{
ShowMsg('验证码不正确!', '-1', 0, 2000);
exit();
}
// 2. 用户名和密码校验
// $cuserLogin 是 userlogin.class.php 的一个实例
$res = $cuserLogin->checkUser($userid, $pwd);
// 3. 处理验证结果
if($res==1)
{
// 登录成功,跳转到首页
header("location:index.php");
exit();
}
else
{
// 登录失败,显示错误信息
$msg = '';
if($res==-1) $msg = '用户不存在或被禁用!';
else if($res==-2) $msg = '密码错误!';
else if($res==-3) $msg = '管理员未开启登录功能!';
ShowMsg($msg, '-1', 0, 2000);
exit();
}
}
- 数据过滤:使用
preg_replace对用户名和密码进行过滤,防止SQL注入等基础攻击,但这种方式已不推荐,应使用更安全的参数化查询。 - 验证码:
$svali是系统生成的Session验证码,与用户输入的$vdcode进行比对,大小写不敏感,这是防止暴力破解的第一道防线。 - 核心验证:
$cuserLogin->checkUser($userid, $pwd)是验证的核心,它会:- 查询
#@__admin表(管理员表)中是否存在该用户名。 - 对用户输入的密码进行MD5加密,然后与数据库中存储的密码进行比对。
- 检查用户的管理员角色(如是否为超级管理员)。
- 查询
- 结果处理:
1: 登录成功。-1: 用户不存在或被禁用。-2: 密码错误(最常见的情况)。-3: 管理员权限未开启。
生成登录凭证
当 checkUser() 返回成功时,userlogin.class.php 内部会自动处理Session的创建,它会将用户ID、用户名、角色等信息存入 $_SESSION 数组中,$_SESSION['aid']、$_SESSION['adminid'] 等,之后,后台的每一个页面都会检查这些Session变量来判断用户是否已登录。
显示登录页面
如果用户直接访问 login.php(即 dopost 为空),或者登录失败,程序会加载并显示登录页面模板。
// 如果没有执行登录操作,则显示登录页面
if(empty($dopost))
{
// 获取验证码
$svali = GetCkVdValue();
// 加载登录模板
include(DEDETEMPLATE.'/login.htm');
exit();
}
GetCkVdValue(): 生成验证码并将其值存入Session,供后续验证使用。include(DEDETEMPLATE.'/login.htm'): 加载登录页面的HTML模板文件,这个模板文件位于/templets/目录下,它定义了登录表单的HTML结构,包括用户名、密码、验证码输入框和登录按钮。
安全注意事项
login.php 是攻击者重点关注的对象,因此了解其安全点至关重要。
-
暴力破解:
- 风险:攻击者通过脚本不断尝试用户名和密码组合,直到猜对为止。
- 织梦的防御:
- 验证码:登录时必须输入图形验证码,有效防止自动化脚本。
- 失败延迟:虽然代码中没有明确看到
sleep()延迟,但验证码本身就是最有效的防御手段。
- 建议:
- 定期更换管理员用户名和密码,使用复杂密码(大小写字母+数字+符号)。
- 修改默认管理员账号,不要使用
admin。 - 可以通过修改
login.php或在服务器层面(如Nginx/Apache)配置失败次数限制,例如登录失败5次后IP被临时封禁。
-
文件包含漏洞:
- 风险:如果攻击者能控制
config.php或其他被包含的文件路径,可能导致服务器被控制。 - 织梦的防御:代码中使用了
dirname(__FILE__)来确保文件路径是相对于当前脚本的,这很安全。 - 建议:确保
config.php等关键文件不能通过Web直接访问,服务器会配置.htaccess(Apache) 或nginx.conf(Nginx) 来禁止访问这些文件。
- 风险:如果攻击者能控制
-
版本过旧:
- 风险:旧版本的织梦CMS可能存在已知的SQL注入、XSS、文件上传等安全漏洞。
- 织梦的防御:代码开头有PHP版本检查,提示用户升级。
- 建议:始终保持织梦CMS到最新版本,并及时关注官方安全更新。
-
Session安全:
- 风险:Session劫持。
- 织梦的防御:依赖PHP默认的Session机制。
- 建议:在
php.ini中配置安全的Session设置,如session.cookie_httponly=1,session.use_only_cookies=1。
常见问题排查
-
提示“验证码不正确”
- 原因:Session未正确开启或过期;浏览器禁用了Cookie;验证码图片无法加载。
- 解决:检查浏览器Cookie设置;清除浏览器缓存和Cookie;确保服务器开启了Session功能。
-
提示“密码错误”
- 原因:输入的密码不正确;密码大小写错误;数据库中密码损坏。
- 解决:确认密码输入无误;联系超级管理员在数据库中重置密码(重置时会对新密码进行MD5加密)。
-
登录成功后跳转回登录页面
- 原因:Session没有成功保存,通常是
data目录(存放Session文件的目录)权限不正确(需要设置为755或777,视服务器安全策略而定)。 - 解决:检查并赋予
/data目录正确的读写执行权限。
- 原因:Session没有成功保存,通常是
-
页面一片空白或报错
- 原因:PHP版本过低(代码开头有检查);PHP环境缺少必要的扩展(如
gd2库用于验证码);文件权限问题。 - 解决:升级PHP版本;检查并安装所需PHP扩展;检查文件和目录权限。
- 原因:PHP版本过低(代码开头有检查);PHP环境缺少必要的扩展(如
login.php 是织梦后台的守护者,它的逻辑虽然不复杂,但环环相扣,任何一个环节出错都可能导致登录失败,理解其工作原理,不仅能帮助您快速解决登录问题,更能让您从安全角度审视和管理您的网站,对于管理员来说,保持系统更新、使用强密码、保护好服务器文件权限是防范登录风险最有效的手段。
