首页 > 数据库 > SQL > 正文

SQL如何找出中断登录的用户_SQL查询登录中断用户方法

爱谁谁
发布: 2025-09-15 11:06:01
原创
588人浏览过
答案:分析中断登录数据可揭示安全风险与用户体验问题。通过SQL查询不同日志结构,识别未完成或异常终止的登录行为,进而发现攻击模式、系统故障及流程缺陷,提升系统安全性与用户满意度。

sql如何找出中断登录的用户_sql查询登录中断用户方法

要用SQL找出中断登录的用户,我们主要关注的是那些登录尝试未能成功完成,或者在登录流程的某个阶段被异常中断的记录。这通常意味着我们需要在一个记录用户登录行为的日志表里,寻找特定的状态码、错误信息,或者通过时间戳比对来判断会话的完整性。核心思路是识别那些“有开始无结束”或“有尝试但状态异常”的登录事件。

解决方案

要具体找出中断登录的用户,这很大程度上取决于你的系统如何记录登录活动。没有一个放之四海而皆准的“中断登录”状态码,因为这本身就是一个需要我们去定义的行为。但我可以提供几种常见的思路和对应的SQL查询范例。

首先,我们假设有一个名为

login_attempts
登录后复制
的表,它记录了用户的每次登录尝试,包含以下关键字段:

  • attempt_id
    登录后复制
    (INT, PRIMARY KEY)
  • user_id
    登录后复制
    (INT)
  • username
    登录后复制
    (VARCHAR)
  • attempt_time
    登录后复制
    (DATETIME)
  • status
    登录后复制
    (VARCHAR, e.g., 'SUCCESS', 'FAILED_PASSWORD', 'FAILED_MFA', 'TIMEOUT', 'ERROR_DB')
  • ip_address
    登录后复制
    (VARCHAR)
  • session_id
    登录后复制
    (VARCHAR, if a session is initiated early)

场景一:基于明确的失败状态码

如果你的系统在登录中断时会记录一个特定的失败状态,比如

TIMEOUT
登录后复制
ERROR_DB
登录后复制
FAILED_MFA
登录后复制
(表示多因素认证未完成),那么查询就相对直接。

SELECT
    user_id,
    username,
    attempt_time,
    status,
    ip_address
FROM
    login_attempts
WHERE
    status IN ('TIMEOUT', 'ERROR_DB', 'FAILED_MFA')
ORDER BY
    attempt_time DESC;
登录后复制

这个查询会列出所有因为超时、数据库错误或MFA失败而中断登录的用户。这是一种比较直接的“中断”定义。

场景二:基于会话未完成的判断

有时候,登录过程会先创建一个临时的会话ID,但如果登录未成功完成,这个会话可能就不会被正式激活,或者没有对应的“会话结束”记录。这需要一个更复杂的日志结构,比如一个

sessions
登录后复制
表,记录了会话的开始和结束。

假设我们有一个

sessions
登录后复制
表:

  • session_id
    登录后复制
    (VARCHAR, PRIMARY KEY)
  • user_id
    登录后复制
    (INT)
  • start_time
    登录后复制
    (DATETIME)
  • end_time
    登录后复制
    (DATETIME, NULLABLE)
  • status
    登录后复制
    (VARCHAR, e.g., 'ACTIVE', 'INCOMPLETE', 'TERMINATED')

如果一个会话在

start_time
登录后复制
后的一定时间内没有
end_time
登录后复制
status
登录后复制
不是
ACTIVE
登录后复制
TERMINATED
登录后复制
,或者就是
INCOMPLETE
登录后复制
,那么它可能就是中断的。

SELECT
    s.user_id,
    s.session_id,
    s.start_time
FROM
    sessions s
WHERE
    s.end_time IS NULL -- 没有明确的结束时间
    AND s.status = 'INCOMPLETE' -- 或者是一个明确的“不完整”状态
    AND s.start_time > NOW() - INTERVAL '1 DAY'; -- 筛选近期的数据,避免查询过期的僵尸会话
登录后复制

这里

NOW() - INTERVAL '1 DAY'
登录后复制
是一个时间窗口,用于筛选近期未完成的会话。具体的时长需要根据你的系统实际情况来定,比如登录流程通常在几分钟内完成。

场景三:通过事件序列判断(更高级)

有些系统会记录更细粒度的事件,比如

LOGIN_INITIATED
登录后复制
CREDENTIALS_SUBMITTED
登录后复制
MFA_CHALLENGE_SENT
登录后复制
LOGIN_SUCCESS
登录后复制
LOGIN_FAILURE
登录后复制
。中断登录就是指有
LOGIN_INITIATED
登录后复制
CREDENTIALS_SUBMITTED
登录后复制
,但没有在合理时间内跟随
LOGIN_SUCCESS
登录后复制
或明确的
LOGIN_FAILURE
登录后复制
(比如密码错误,这与中断略有不同)。

这通常需要用到窗口函数或复杂的自连接。假设有一个

audit_log
登录后复制
表:

  • log_id
    登录后复制
    (INT)
  • user_id
    登录后复制
    (INT)
  • event_time
    登录后复制
    (DATETIME)
  • event_type
    登录后复制
    (VARCHAR, e.g., 'LOGIN_INITIATED', 'CREDENTIALS_SUBMITTED', 'LOGIN_SUCCESS', 'LOGIN_FAILED_PASSWORD', 'MFA_CHALLENGE_SENT', 'MFA_RESPONSE_TIMEOUT')
WITH UserLoginEvents AS (
    SELECT
        user_id,
        event_time,
        event_type,
        LEAD(event_type, 1) OVER (PARTITION BY user_id ORDER BY event_time) AS next_event_type,
        LEAD(event_time, 1) OVER (PARTITION BY user_id ORDER BY event_time) AS next_event_time
    FROM
        audit_log
    WHERE
        event_type IN ('LOGIN_INITIATED', 'CREDENTIALS_SUBMITTED', 'LOGIN_SUCCESS', 'LOGIN_FAILED_PASSWORD', 'MFA_CHALLENGE_SENT', 'MFA_RESPONSE_TIMEOUT')
)
SELECT DISTINCT
    ule.user_id,
    ule.event_time AS interrupted_start_time,
    ule.event_type AS last_known_event
FROM
    UserLoginEvents ule
WHERE
    ule.event_type IN ('LOGIN_INITIATED', 'CREDENTIALS_SUBMITTED', 'MFA_CHALLENGE_SENT')
    AND (
        ule.next_event_type IS NULL -- 没有后续事件
        OR (
            ule.next_event_type NOT IN ('LOGIN_SUCCESS', 'LOGIN_FAILED_PASSWORD', 'MFA_RESPONSE_TIMEOUT') -- 后续事件不是明确的成功或失败,也不是MFA超时
            AND ule.next_event_time > ule.event_time + INTERVAL '5 MINUTE' -- 且下一个事件间隔太久,可以认为是中断
        )
        OR ule.next_event_type = 'MFA_RESPONSE_TIMEOUT' -- 明确的MFA超时也是一种中断
    )
ORDER BY
    interrupted_start_time DESC;
登录后复制

这个例子有点复杂,但它尝试捕捉的是“启动了某个流程,但没有在合理时间内得到预期的完成或明确的失败反馈”的情况。

INTERVAL '5 MINUTE'
登录后复制
是一个示例,需要根据实际业务逻辑调整。

如何准确定义和识别“中断登录”的多种情境?

在我看来,“中断登录”这个概念本身就带有一些模糊性,它不像“登录成功”或“密码错误”那样一目了然。准确地定义和识别它,其实是对我们系统日志设计和业务流程理解的考验。

从用户的角度看,中断登录可能意味着:

AI Sofiya
AI Sofiya

一款AI驱动的多功能工具

AI Sofiya 103
查看详情 AI Sofiya
  1. 用户主动放弃: 比如输入了一半密码,发现不是自己的账号,或者突然有事,直接关掉了浏览器。这种情况下,日志里可能只有
    LOGIN_INITIATED
    登录后复制
    ,没有后续动作。
  2. 技术性失败导致:
    • 网络问题 用户在输入凭据后,提交请求时网络断开,请求未能到达服务器。服务器端可能没有任何记录,或者只记录了TCP连接建立失败。
    • 服务器端错误: 数据库连接池耗尽、认证服务宕机、内部API调用失败等。此时,日志中可能会出现
      ERROR_DB
      登录后复制
      AUTH_SERVICE_UNAVAILABLE
      登录后复制
      等错误码。
    • 多因素认证(MFA)超时或失败: 用户收到了MFA挑战,但未能及时响应,或者响应失败。日志里会有
      MFA_CHALLENGE_SENT
      登录后复制
      却没有
      MFA_SUCCESS
      登录后复制
      ,或者有
      MFA_TIMEOUT
      登录后复制
    • 会话创建异常: 登录凭据验证通过了,但因为某些原因(比如存储会话的Redis故障),导致会话无法正常创建并返回给用户。

从系统日志的角度,识别这些情境的关键在于:

  • 状态码的细化: 不要只有
    SUCCESS
    登录后复制
    FAILED
    登录后复制
    FAILED
    登录后复制
    可以进一步细分为
    FAILED_PASSWORD
    登录后复制
    FAILED_USERNAME_NOT_FOUND
    登录后复制
    FAILED_ACCOUNT_LOCKED
    登录后复制
    等。而中断则需要更具体的,如
    TIMEOUT_NETWORK
    登录后复制
    ERROR_INTERNAL_SERVER
    登录后复制
    MFA_ABANDONED
    登录后复制
  • 事件序列的完整性: 任何一个完整的登录流程都应该有一个清晰的开始和结束。如果只有开始事件,没有在预期时间内的结束事件(无论是成功还是明确的失败),那很可能就是中断。这就像一个故事,只讲了开头,没有结局。
  • 时间戳的关联: 通过分析连续事件之间的时间间隔,我们可以判断一个登录尝试是否在合理的时间窗口内完成。如果
    LOGIN_INITIATED
    登录后复制
    LOGIN_SUCCESS
    登录后复制
    之间间隔了异常长的时间,或者根本没有
    LOGIN_SUCCESS
    登录后复制
    ,那就值得怀疑。

所以,准确定义“中断登录”,首先要明确你的系统在哪些环节可能出现非预期的流程终止,然后确保在这些关键点有相应的日志记录。这不单单是SQL查询的问题,更是日志架构设计的问题。

在不同的数据库日志结构中,如何设计有效的SQL查询来捕获中断登录事件?

设计有效的SQL查询来捕获中断登录事件,确实需要我们根据具体的数据库日志结构来灵活调整。我见过很多不同的日志表设计,每种都有其查询的特点和难点。

1. 扁平化日志表(如

login_attempts
登录后复制

这是最常见的结构,所有登录尝试都记录在一行,通过

status
登录后复制
字段来区分结果。

  • 结构示例:
    attempt_id
    登录后复制
    ,
    user_id
    登录后复制
    ,
    attempt_time
    登录后复制
    ,
    status
    登录后复制
    ,
    error_message
    登录后复制
    ,
    ip_address
    登录后复制
  • 查询思路: 直接筛选
    status
    登录后复制
    字段,找出那些表示中断或非成功/非明确失败的状态。
  • SQL范例:
    -- 查找最近24小时内,状态为“超时”或“内部错误”的登录中断用户
    SELECT
        user_id,
        MAX(attempt_time) AS last_interruption_time,
        COUNT(*) AS interruption_count
    FROM
        login_attempts
    WHERE
        attempt_time >= NOW() - INTERVAL '24 HOUR'
        AND status IN ('TIMEOUT', 'SERVER_ERROR', 'MFA_INCOMPLETE')
    GROUP BY
        user_id
    HAVING
        COUNT(*) > 1 -- 筛选出多次中断的用户,可能存在系统问题或用户操作习惯问题
    ORDER BY
        interruption_count DESC;
    登录后复制

    这个查询的优势是简单直观,但前提是

    status
    登录后复制
    字段的粒度要足够细。如果
    status
    登录后复制
    只有
    SUCCESS
    登录后复制
    FAILED
    登录后复制
    ,那么就很难区分是密码错误还是真正的中断。

2. 会话跟踪表(如

user_sessions
登录后复制

这类表通常用于跟踪用户的整个会话生命周期,登录只是会话的开始。

  • 结构示例:
    session_id
    登录后复制
    ,
    user_id
    登录后复制
    ,
    login_time
    登录后复制
    ,
    logout_time
    登录后复制
    ,
    session_status
    登录后复制
    (
    ACTIVE
    登录后复制
    ,
    INCOMPLETE
    登录后复制
    ,
    EXPIRED
    登录后复制
    ,
    TERMINATED
    登录后复制
    )
  • 查询思路: 查找那些
    logout_time
    登录后复制
    为空,且
    session_status
    登录后复制
    不是
    ACTIVE
    登录后复制
    TERMINATED
    登录后复制
    的会话,或者
    login_time
    登录后复制
    之后长时间没有
    logout_time
    登录后复制
    的会话。
  • SQL范例:
    -- 查找在过去1小时内开始,但至今未有结束时间且状态为“不完整”的会话
    SELECT
        us.user_id,
        us.session_id,
        us.login_time
    FROM
        user_sessions us
    WHERE
        us.login_time >= NOW() - INTERVAL '1 HOUR'
        AND us.logout_time IS NULL
        AND us.session_status = 'INCOMPLETE'; -- 假设有INCOMPLETE状态
    登录后复制

    这里,

    INCOMPLETE
    登录后复制
    状态的设置非常关键。如果你的系统没有这个状态,那么判断
    logout_time IS NULL
    登录后复制
    结合一个合理的超时时间(比如
    login_time < NOW() - INTERVAL '30 MINUTE'
    登录后复制
    logout_time IS NULL
    登录后复制
    )也是一种方法。

3. 事件流日志表(如

audit_events
登录后复制

这种结构记录了用户在系统中的一系列离散事件,登录过程的每个步骤都是一个事件。

  • 结构示例:
    event_id
    登录后复制
    ,
    user_id
    登录后复制
    ,
    event_time
    登录后复制
    ,
    event_type
    登录后复制
    (
    LOGIN_INITIATED
    登录后复制
    ,
    CREDENTIALS_VERIFIED
    登录后复制
    ,
    MFA_CHALLENGE_SENT
    登录后复制
    ,
    LOGIN_SUCCESS
    登录后复制
    ,
    LOGIN_FAILED_AUTH
    登录后复制
    ),
    details
    登录后复制
  • 查询思路: 这是最灵活也最复杂的,需要通过事件序列来推断。我们可以查找有“开始事件”但缺少“结束事件”的情况。通常会用到窗口函数 (
    LEAD
    登录后复制
    ,
    LAG
    登录后复制
    ) 或自连接。
  • SQL范例(使用窗口函数):
    WITH UserEventSequence AS (
        SELECT
            user_id,
            event_time,
            event_type,
            LEAD(event_type) OVER (PARTITION BY user_id ORDER BY event_time) AS next_event_type,
            LEAD(event_time) OVER (PARTITION BY user_id ORDER BY event_time) AS next_event_time
        FROM
            audit_events
        WHERE
            event_time >= NOW() - INTERVAL '6 HOUR' -- 关注近期事件
            AND event_type IN ('LOGIN_INITIATED', 'CREDENTIALS_VERIFIED', 'MFA_CHALLENGE_SENT', 'LOGIN_SUCCESS', 'LOGIN_FAILED_AUTH', 'MFA_TIMEOUT')
    )
    SELECT DISTINCT
        ues.user_id,
        ues.event_time AS interruption_start_time,
        ues.event_type AS last_known_event_before_interruption
    FROM
        UserEventSequence ues
    WHERE
        ues.event_type IN ('LOGIN_INITIATED', 'CREDENTIALS_VERIFIED', 'MFA_CHALLENGE_SENT')
        AND (
            ues.next_event_type IS NULL -- 没有后续事件
            OR (
                ues.next_event_type NOT IN ('LOGIN_SUCCESS', 'LOGIN_FAILED_AUTH') -- 后续事件不是明确的成功或认证失败
                AND ues.next_event_time > ues.event_time + INTERVAL '5 MINUTE' -- 且间隔时间过长
            )
            OR ues.next_event_type = 'MFA_TIMEOUT' -- 或者明确的MFA超时
        )
    ORDER BY
        interruption_start_time DESC;
    登录后复制

    这种方式虽然复杂,但能捕捉到更精细的中断情境。比如,用户通过了凭据验证,但在MFA环节中断,这种信息对于分析用户体验和安全风险非常有价值。

选择哪种查询方式,完全取决于你的日志数据如何组织。我个人觉得,事件流日志虽然查询复杂,但它能提供最全面的上下文,对于深入分析“中断”的原因和模式最有帮助。

分析中断登录数据可以为系统安全和用户体验带来哪些洞察?

分析中断登录数据,在我看来,绝不仅仅是找出几个失败的记录那么简单。它像是一面镜子,能同时照出系统潜在的安全漏洞和用户体验上的痛点。这些数据背后隐藏着宝贵的洞察,可以指导我们进行更有效的改进。

对系统安全的洞察:

  1. 潜在的暴力破解或撞库攻击: 如果某个
    user_id
    登录后复制
    ip_address
    登录后复制
    在短时间内出现大量
    LOGIN_INITIATED
    登录后复制
    但没有
    LOGIN_SUCCESS
    登录后复制
    ,或者伴随大量
    MFA_CHALLENGE_SENT
    登录后复制
    但没有完成,这可能不是简单的用户操作失误,而是一种自动化攻击尝试。这些中断数据可以帮助我们识别异常模式,触发告警,甚至自动封锁可疑IP或用户。
  2. 系统级故障或瓶颈: 如果在某个特定时间段内,大量用户出现
    SERVER_ERROR
    登录后复制
    DATABASE_ERROR
    登录后复制
    TIMEOUT
    登录后复制
    状态的中断,这强烈暗示了系统后端服务可能存在稳定性问题、性能瓶颈,或者某些依赖服务(如认证服务、MFA服务)出现了故障。这些数据能帮助运维团队快速定位问题。
  3. MFA绕过尝试: 持续的MFA中断,尤其是来自异常IP或设备的用户,可能意味着攻击者正在尝试绕过MFA机制。通过分析这些中断,我们可以加强MFA的防御策略。
  4. 账户锁定策略有效性: 如果有大量用户因多次中断(可能是多次密码错误或MFA失败)而被锁定,这可以评估当前账户锁定策略的合理性,是过于严格导致用户体验下降,还是过于宽松无法有效阻止攻击。

对用户体验(UX)的洞察:

  1. 登录流程的摩擦点: 如果大量用户在
    MFA_CHALLENGE_SENT
    登录后复制
    阶段中断,这可能表明MFA流程过于复杂、耗时,或者用户不理解如何操作。又或者,在
    CREDENTIALS_SUBMITTED
    登录后复制
    之后,到
    LOGIN_SUCCESS
    登录后复制
    之前有大量的
    TIMEOUT
    登录后复制
    ,这可能是服务器响应慢导致的。这些数据直接指向了用户在登录路径上的痛点。
  2. UI/UX设计缺陷: 模糊的错误提示、不清晰的输入框、复杂的验证码,都可能导致用户在登录过程中感到困惑并最终放弃。虽然日志不直接记录UI问题,但持续的用户中断可以作为我们深入研究用户行为(比如通过热图、用户访谈)的起点。
  3. 跨设备或网络兼容性问题: 如果特定设备类型、浏览器版本或网络环境下的用户出现高比例的中断,这可能意味着登录页面在

以上就是SQL如何找出中断登录的用户_SQL查询登录中断用户方法的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号