PHP网站如何防止多次登录

2024-03-30

我想防止在 php 应用程序中多次登录。

首先,我在用户表中创建登录状态(活动、非活动)。

当用户 A 登录时,用户状态将设置为“active”,如果用户注销,状态将设置为“notactive”。当另一个客户端尝试使用相同的用户帐户登录时,我会检查用户表。如果用户仍然处于活动状态,则会向用户发送错误登录信息。

出现问题时,如果用户关闭浏览器,则用户表中的状态可以更新,因为用户没有单击注销。

您对此有什么建议吗?


(请注意,虽然这里的技术仍然有些有效;PHP 示例不应逐字复制,因为有更安全的方法可以将用户提供的值合并到 SQL 查询中)


与其存储用户是否处于活动\非活动状态,不如存储一些可以针对每个操作检查用户的属性;例如,每次用户尝试执行需要身份验证的操作时,它都会在继续之前检查该属性是否匹配。

我建议您执行以下操作;

首先,创建一个哈希值,以便在用户登录时唯一标识用户。我想sha1 http://php.net/manual/en/function.sha1.php of time() http://php.net/manual/en/function.time.php足以避免碰撞。无论您选择什么,请确保它足够多样化,以便其他登录用户收到相同哈希值的机会极低(例如,不要对 IP 地址或浏览器的用户代理进行哈希处理,因为这些内容并没有变化)足够的)。

其次,将此哈希值存储在您的数据库和用户的数据库中session http://www.php.net/manual/en/book.session.php这样做会有效地“注销”以前的用户,因为每次有人登录时哈希值都应该不同。

由于我们使用会话,因此应自动将 cookie 放置在用户的浏览器中,该浏览器将包含一个唯一 ID,用于识别用户的会话数据。 cookie 的内容并不是真正值得关注的。

接下来,创建一个名为的函数authenticateUser()或类似的,它将在每个脚本开始时调用,以确保用户经过身份验证。此脚本应查询数据库,检查具有您的用户 ID 的用户是否具有与您的用户的哈希相匹配的哈希。

例如:

function authenticateUser($id, $hash, $databaseLink) {
    # SQL
    $sql = 'SELECT EXISTS(
               SELECT 1
               FROM `tbl_users`
               WHERE `id` = \''.mysql_real_escape_string($id).'\'
               AND `hash` = \''.mysql_real_escape_string($hash).'\'
               LIMIT 1
           );';

    # Run Query
    if ($query = mysql_query($sql, $databaseLink)) {
        # Get the first row of the results
        # Assuming 'id' is your primary key, there
        # should only ever be one row anyway.       
        $result = mysql_fetch_row($query);

        # Casting to boolean isn't strictly necessary here
        # its included to indicate the mysql result should
        # only ever been 1 or 0.
        return (bool)($result[0]);
    } else {
        # Query error :(
        return false;
    }
}

然后,我们只需通过authenticateUser()用户的ID, hash(根据您的会话数据)和database link(对于数据库连接,您必须提前打开)。

If authenticateUser()回报true,用户已通过身份验证。如果false、用户不存在或数据库不可用或存在 SQL 错误。

但请注意,这会增加您的服务器负载,因为每个页面请求都会发送一次数据库请求。在任何特定时间都有数千人登录的大型项目上这样做可能不太明智。我确信有人可以提出改进建议。

此外,等待 cookie 过期并不是强制不活动的用户注销的最佳方法,因为您永远不应该信任 cookie。相反,您可以添加一个名为last_active您可以在每次用户通过身份验证时更新它。这也会增加服务器负载,但允许您通过删除hash对于例如 3 小时不活动的用户。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP网站如何防止多次登录 的相关文章

  • C++ 相当于 PHP 的 pack()

    我的问题很简单 有没有类似 PHP 的pack and unpack C STL 中的函数 如果没有 是否有其他方法可以实现相同的目标 https www php net pack https www php net pack Thanks
  • 客户端和服务器端编程有什么区别?

    我有这个代码 为什么这不会将 bar 写入我的文本文件 而是警告 42 注意 这个问题的早期修订明确涉及服务器上的 PHP 和客户端上的 JavaScript 问题的本质和解决方案是相同的any当一种语言在客户端上运行而另一种语言在服务器上
  • PHP 中 file、file_get_contents 和 fopen 之间的区别

    我是 PHP 新手 我不太确定 两者之间有什么区别file file get contents and fopen 函数 什么时候应该使用其中一个而不是另一个 前两个 file http www php net manual en func
  • 如何解析cURL返回的header?

    我正在尝试使用 cURL 与 API 进行通信 其中一种方法要求我传递ININ ICWS CSRF Token标题 即WAhtYWxoYXlla1dBY2NvUkRJWCQxZmUxZWFhZS0xZTE0LTQyNGYtYjdhZS0zN
  • 如何使用 jquery ajax 将锚点的值发送到 php

    我正在尝试使用 jquery 将几个锚点的值发送到 php 文件 但我没有从 php 脚本中得到回调 div class result div a href value class star Star 5 a a href value cl
  • PHP 从日志事件中获取行号

    好的 我还有一个问题HERE https stackoverflow com questions 3213423 php how could i make this class better suggestions feedback wel
  • 如何在 PHP 中运行 shell 脚本?

    我正在尝试使用 PHP 触发 shell 脚本的运行 本质上 当用户在我们用 PHP 编写的网站上完成一个操作时 我们希望触发一个 shell 脚本 该脚本本身调用一个 Java 文件 提前致谢 See shell exec http ph
  • php exec 返回的结果比直接进入命令行要少

    我有一个 exec 命令 它的行为与通过 Penguinet 给 linux 的相同命令不同 res exec cd mnt mydirectory zcat log file gz echo res 当将命令直接放入命令行时 我在日志文件
  • 限制分页页数

    objConnect mysql connect localhost root or die mysql error objDB mysql select db Test strSQL SELECT FROM UserAddedRecord
  • 用PHP动态生成二维码[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试在我的网站上生成二维码 他们所要做的就是在其中包含一个 URL 我网站上的变量将提供该 URL
  • 使用 DateTime 类计算日期差异时出错

    我正在尝试使用 DateTime 类 php gt 5 3 来计算 2 个日期的差异 手册中的示例简单明了 我尝试了该示例并且效果很好 但如果改变开始和结束日期 就会出现问题 this gt start date 2011 03 01 th
  • Opencart 的 $this->config->get('module_var_name')

    我正在尝试自定义 Opencart 支付模块 我看到很多地方都使用了配置信息 但我找不到任何创建正在使用的变量的内容 我知道在管理页面中 如果我选择 paypal 标准 我可以设置所有 配置 信息 但我找不到强调它的 模型 是否有模型 我希
  • 无法显示由 Fine-uploader 上传到 Amazon s3 的图像

    我现在尝试设置fineuploader s3以显示在aws服务器上成功上传的文件的图像 如示例页面上所做的那样 http fineuploader com s3 demo http fineuploader com s3 demo 我 仍然
  • 使用php插入sql数据库时出错

    我有一个带有 MySQL 插入查询的程序 sql INSERT INTO people person id name username password email salt VALUES person id name username p
  • MySQL 中布尔值的 TINYINT 与 ENUM(0, 1)

    MyISAM 表和 MySQL 5 1 中具有 0 和 1 值的 Tinyint 或 ENUM 0 1 哪个更好 您可以使用BIT 1 如中提到的MySQL 5 1 参考 http dev mysql com doc refman 5 1
  • PHP多图像文件上传并存储到文件夹和数据库

    我正在建立一个网站 向夜间狂欢者展示大城市夜总会场所和活动的列表 我正在尝试构建一个后端页面 管理员可以在其中添加俱乐部并输入信息 例如机构名称 位置 相对价格等 当然还有俱乐部的一些图像 每个俱乐部必须至少有一张图像 即主图像 可以有额外
  • 除括号之间的内容外,所有内容均小写

    考虑以下字符串 LoReM FOO IPSUM dolor BAR Samet fooBar 我正在寻找一种方法来小写所有内容 除了 brackets 之间的内容应该被忽略 所以期望的输出是 lorem FOO ipsum dolor BA
  • PHP:如何检查总数。 URL 中的参数?

    我正在使用 REQUEST 检索参数 有没有办法找到总数 URL 中的参数 而不是检索每个参数然后进行计数 这将为您提供总数 分隔的 URL 查询参数 count explode SERVER QUERY STRING 如果您只想要唯一的参
  • Couchdb - 为读者用户提供的蒲团

    我想知道如何阻止读者访问 couchdb 中的 futon utils 只允许管理员访问 我需要这样做 为什么如果读者用户访问蒲团 他可以看到我所有数据库的名称以及有多少文档 我的应用程序应该让读者只有在知道文档 ID 时才能访问文档 引用
  • 在 PHP 命令行上显示完整的堆栈跟踪

    Problem 我的 PHP 堆栈跟踪缩写为 Stack trace 0 www html table app create php 128 SoapClient gt call call Array 1 www html table ap

随机推荐

  • 作为 Xcode 构建过程的一部分,如何运行上传符号来上传 dSYM?

    好的 所以我正在尝试自动上传 dSYM 我正在遵循此官方文档中的说明 https firebase google com docs crashlytics get deobfuscated reports https firebase go
  • 左右声道与麦克风录音分离

    我试图从麦克风录制并将录制的数据仅发送到左通道 右通道上有零 但我的技术似乎不起作用 我正在使用 PCM 16 和单声道模式的录音和音轨 我似乎做错了什么 package com example leftrighttest import a
  • 色彩图的非线性缩放以增强对比度

    以下 python 代码创建包含正态分布值的矩阵热图 import numpy as np from matplotlib import pylab as plt np random seed 123 make sure we all ha
  • 如何迁移到WKWebView?

    我试图了解如何使用 iOS8 中新的 WKWebView 但找不到太多信息 我读了 http developer telerik com featured why ios 8s wkwebview is a big deal for hyb
  • 学习 Objective-C 的好资源 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Maven 获取特定类

    有没有一种方法可以让 maven 在将依赖项导入 uber jar shade 时仅包含特定的 class 文件 我正在寻找一种方法来将名称中包含 Client 的文件从依赖项 jar 中提取出来并添加到最终的 jar 中 任何帮助都会很棒
  • Python 中的字母数字排序和负数

    我有一个相当简单的列表 一个数字后跟一个句子 这里按正确的顺序 347 a negative number 100 another negative number 25 and again a negative number 17 some
  • ArrayCollection 删除排序

    对我的数据提供程序 数组集合 应用数字排序后 我无法通过平铺列表对项目重新排序 我是否需要从 arrayCollection txt 中删除排序 如果是这样 这只是设置 collection sort null 的情况吗 var sortF
  • 为什么用户控件加载事件没有被触发

    我有一个用户控件 我有时再次遇到这种情况 但总是可以通过使用 New 构造函数 但我仍然想知道我做错了什么 因为如果加载了控件 则必须触发 load 事件 这是一些代码
  • 签名 url 中存在 MalformedSecurityHeader 错误 - 标头包含在签名标头中,但未包含在请求中

    我正在尝试使用签名 URL 使用 React 和 Node js 通过 Google 应用程序引擎上传文件 我能够生成签名 URL 但在控制台中收到 CORS 错误时 当我在浏览器中打开签名 URL 时 收到以下错误
  • 错误 LNK1120:1 未解析的外部 - VS13 C [重复]

    这个问题在这里已经有答案了 我尝试编译这段代码 include
  • 如何在 Yahoo PHP5 Sdk yos-social-php5 上使用 YQL 获取私有数据

    我在用雅虎 PHP5 SDK https github com yahoo yos social php5并使用它从表 Social contacts 中获取用户联系人 该表是私有数据 在 Delicious 的示例中 它仅显示从 YQL
  • 使用 Swift 的预期声明错误

    我正在尝试传递 a 的布尔值UISwitch到另一个班级使用NSUserDefaults 由于某种原因 在包含开关的类中 if应该将值设置为的语句NSUserDefaults无法读取 switch 声明 ViewController swi
  • jquery .eq() 方法中的“eq”代表什么?

    例子 td eq 2 css color red or td eq 2 css color red 我想知道缩写 eq 代表什么 我不是问 eq 方法是做什么的 可以找到here http api jquery com eq 关于这个问题的
  • Mono Cecil 生成 PDB 时出错

    下面的代码允许我更改方法主体并保存回程序集 Recreate PDB var assemblyResolver new DefaultAssemblyResolver var assemblyLocation Path GetDirecto
  • 当值是列表时交换字典键和值

    类似于这个问题 https stackoverflow com questions 1031851 python best way to exchange keys with values in a dictionary and 这个问题
  • 初始化 Facebook 评论后加载 jScrollPane - 如何?

    Facebook 评论插件是否有 onComplete 状态或类似状态 我正在尝试将 jScrollPane 滚动条添加到其中包含 FB Comments 的内容框 发生的情况是我将 FB Comments iframe 放置在框内容的顶部
  • 从 R 中的语料库创建单词子集

    我使用 XML 包根据 Twitter 搜索创建了一个 1 500 行向量 然后我将其转换为语料库以与 tm 包一起使用 我希望最终使用其中一些 最常见的 单词创建一个词云 因此我将其转换为 TermDocumentMatrix 以便能够找
  • EF LINQ ToList 非常慢

    我在用ASP NET MVC4 5 和EF6 代码优先迁移 我有这段代码 大约需要 6 秒 var filtered repository Requests Where r gt some conditions this is fast c
  • PHP网站如何防止多次登录

    我想防止在 php 应用程序中多次登录 首先 我在用户表中创建登录状态 活动 非活动 当用户 A 登录时 用户状态将设置为 active 如果用户注销 状态将设置为 notactive 当另一个客户端尝试使用相同的用户帐户登录时 我会检查用