织梦5.7免登陆接口如何实现安全免登录?

99ANYc3cd6
预计阅读时长 23 分钟
位置: 首页 织梦建站 正文

织梦DedeCMS 5.7本身并没有提供一个官方的、名为“免登录接口”的功能,我们可以通过分析其用户登录机制,手动创建一个自定义的API接口,来实现外部系统(如App、其他网站、小程序等)让用户免登录进入织梦后台或会员中心。

织梦5.7免登陆接口
(图片来源网络,侵删)

这个接口的核心原理是:模拟织梦的后台登录验证流程,如果验证成功,我们就在服务端生成一个有效的织梦后台Cookie,然后通过重定向或返回Cookie信息,让用户的浏览器在访问织梦后台时,服务器误以为用户已经登录。


第一步:理解织梦DedeCMS 5.7的登录验证机制

在动手之前,我们必须搞清楚织梦是如何判断用户是否登录的。

  1. 登录页面/dede/login.php
  2. 处理登录的脚本/dede/login_action.php
  3. 核心验证逻辑
    • login_action.php 接收用户名和密码。
    • 它会调用 include/login.class.php 中的 checkUser() 方法。
    • checkUser() 方法会查询 dede_admin 表,验证用户名和密码是否正确。注意:密码是经过 md5() 加密存储的。
    • 如果验证成功,它会更新 dede_admin 表中该用户的 logintime (登录时间) 和 loginip (登录IP)。
    • 最关键的一步是:它会设置一个 Cookie,名称通常是 dede_logintime,值为当前的时间戳,这个 Cookie 是判断用户是否处于登录状态的主要依据之一。
  4. 全局登录判断:在织梦后台的每个页面(如 index.php),开头都会包含 include/common.inc.php,这个文件会检查是否存在有效的 dede_logintime Cookie,如果没有,或者 Cookie 中的时间与服务器记录不符,就会判定用户未登录并跳转到登录页。

我们的目标就是创建一个脚本,它能正确验证用户名和密码,并在成功后,手动在用户浏览器上设置这个关键的 dede_logintime Cookie


第二步:创建免登录接口

我们将创建一个独立的PHP文件作为我们的API接口。

织梦5.7免登陆接口
(图片来源网络,侵删)

创建接口文件

在织梦根目录下(与 dede 文件夹同级)创建一个新文件,api/login.php

编写接口代码

打开 api/login.php,粘贴以下代码,代码中包含了详细的注释,解释了每一步的作用。

<?php
/**
 * 织梦DedeCMS 5.7 免登录接口
 * 使用方法: /api/login.php?username=你的用户名&password=你的密码
 */
// 1. 设置必要的请求头,防止中文乱码
header('Content-Type: text/html; charset=utf-8');
// 2. 引入织梦数据库配置文件,获取数据库连接信息
// 这一步非常重要,可以确保我们的接口使用与织梦相同的数据库配置
require_once (dirname(__FILE__) . "/dede/config.php");
// 3. 获取前端传递的参数
$username = isset($_GET['username']) ? trim($_GET['username']) : '';
$password = isset($_GET['password']) ? trim($_GET['password']) : '';
// 4. 参数校验
if (empty($username) || empty($password)) {
    // 返回JSON格式的错误信息
    $response = [
        'code' => 400,
        'msg'  => '用户名和密码不能为空',
        'data' => null
    ];
    echo json_encode($response, JSON_UNESCAPED_UNICODE);
    exit;
}
// 5. 连接数据库并查询用户
$link = mysql_connect($cfg_dbhost, $cfg_dbuser, $cfg_dbpass);
if (!$link) {
    $response = [
        'code' => 500,
        'msg'  => '数据库连接失败',
        'data' => null
    ];
    echo json_encode($response, JSON_UNESCAPED_UNICODE);
    exit;
}
mysql_select_db($cfg_dbname);
mysql_query("SET NAMES 'utf8'");
// SQL查询语句,注意密码字段是pwd
$sql = "SELECT * FROM `#@__admin` WHERE `userid` = '{$username}' AND `pwd` = md5('{$password}')";
$result = mysql_query($sql);
$user = mysql_fetch_assoc($result);
// 6. 判断用户是否存在及密码是否正确
if (!$user) {
    $response = [
        'code' => 401,
        'msg'  => '用户名或密码错误',
        'data' => null
    ];
    echo json_encode($response, JSON_UNESCAPED_UNICODE);
    exit;
}
// 7. 登录成功,更新登录信息并设置Cookie
// 更新登录时间和IP
$login_time = time();
$login_ip = GetIP(); // 织梦自获取IP函数
mysql_query("UPDATE `#@__admin` SET `logintime` = '{$login_time}', `loginip` = '{$login_ip}' WHERE `userid` = '{$username}'");
// 设置关键的登录Cookie
// setcookie(name, value, expire, path, domain, secure, httponly);
// path必须设置为'/dede',因为织梦后台的Cookie作用域是这个目录
setcookie("dede_logintime", $login_time, time() + 3600 * 24, '/dede/');
// 8. 返回成功信息,并提供后台入口URL
$admin_url = $cfg_cmspath . '/dede/index.php';
$response = [
    'code' => 200,
    'msg'  => '登录成功',
    'data' => [
        'admin_url' => $admin_url,
        'cookie_name' => 'dede_logintime',
        'cookie_value' => $login_time
    ]
];
echo json_encode($response, JSON_UNESCAPED_UNICODE);
// 关闭数据库连接
mysql_close($link);
// 辅助函数:获取IP地址 (从织梦include/helpers下找的)
function GetIP()
{
    if (getenv('HTTP_CLIENT_IP')) {
        $ip = getenv('HTTP_CLIENT_IP');
    } elseif (getenv('HTTP_X_FORWARDED_FOR')) {
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    } elseif (getenv('HTTP_X_FORWARDED')) {
        $ip = getenv('HTTP_X_FORWARDED');
    } elseif (getenv('HTTP_FORWARDED_FOR')) {
        $ip = getenv('HTTP_FORWARDED_FOR');
    } elseif (getenv('HTTP_FORWARDED')) {
        $ip = getenv('HTTP_FORWARDED');
    } elseif (getenv('REMOTE_ADDR')) {
        $ip = getenv('REMOTE_ADDR');
    } else {
        $ip = '127.0.0.1';
    }
    return $ip;
}

第三步:如何使用这个接口

你可以通过以下方式来使用这个接口了。

直接在浏览器中访问

打开浏览器,访问你的织梦网站地址,并带上参数: http://你的域名.com/api/login.php?username=你的后台用户名&password=你的后台密码

织梦5.7免登陆接口
(图片来源网络,侵删)
  • 如果成功,你会看到类似下面的JSON响应:

    {
        "code": 200,
        "msg": "登录成功",
        "data": {
            "admin_url": "/dede/index.php",
            "cookie_name": "dede_logintime",
            "cookie_value": "1678886400"
        }
    }

    你再去访问 http://你的域名.com/dede/index.php,你会发现你已经直接进入了织梦后台,无需再次登录!

  • 如果失败(例如用户名或密码错误),你会看到:

    {
        "code": 401,
        "msg": "用户名或密码错误",
        "data": null
    }

在App、小程序或前端页面中使用

在实际开发中,这个接口通常被App、小程序或前端网站调用,流程如下:

  1. 用户输入:在App或前端页面上,用户输入他们的织梦后台用户名和密码。
  2. 发起请求:前端代码(如JavaScript、Java、Python等)使用 POSTGET 方式向 api/login.php 发送请求。
  3. 处理响应
    • 如果接口返回 code: 200,表示登录成功。关键在于,你的App或前端需要引导用户去访问织梦后台的URL(即响应中的 admin_url)。
    • 当用户的浏览器打开这个 admin_url 时,我们之前设置的 Cookie 已经生效,织梦服务器会认为用户已登录,从而直接展示后台界面。
    • 如果接口返回非 200 的状态码,则向用户显示错误信息。

重要提示:出于安全考虑,千万不要将用户密码明文存储在你的App或前端数据库中,这个接口只适用于“一次性”的登录跳转,即用户输入密码后,立即跳转到织梦后台,后续访问,依赖的是我们设置的 Cookie


第四步:安全注意事项

直接使用这个接口存在安全风险,必须进行加固:

  1. HTTPS协议强烈建议将你的网站配置为使用 HTTPS,这样可以防止在传输用户名和密码时被中间人窃听。
  2. 增加Token验证:为了防止接口被恶意调用(比如被黑客用脚本暴力破解后台密码),你应该增加一个Token验证机制。
    • 实现方法: a. 在织梦后台生成一个唯一的、难以猜测的Token(可以存入数据库或配置文件)。 b. 在调用 api/login.php 时,必须带上这个Token,/api/login.php?username=xxx&password=xxx&token=你的安全Token。 c. 在 login.php 的开头先验证这个Token是否正确,不正确则直接拒绝请求。
  3. 限制调用频率:可以加入简单的代码,限制单个IP在一段时间内(如1分钟)只能调用几次接口,防止暴力破解。
  4. 日志记录:记录每一次接口调用的信息(时间、IP、用户名、是否成功),以便于追踪异常行为。
  5. 接口文件保护:将 api 目录设置为禁止外部访问,或者将 login.php 文件名改为一个随机、难以猜测的名字,减少被扫描到的风险。

通过以上步骤,你就可以为织梦DedeCMS 5.7搭建一个安全、可用的免登录接口了。

-- 展开阅读全文 --
头像
dede子栏目列表分页如何实现?
« 上一篇 今天
dede后台密码忘了怎么办?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]