如何在 PHP 和 MySql 中保存和管理 Session ID 和用户 ID

How to save and manage the Session ID and a User ID in PHP and MySql

我需要澄清我对 PHP sessions 的疑虑。

我正在创建一个 Android app,在某些活动中我需要进行查询以提取用户数据。

此时,我通过 Android app.

中隐藏的 EditText 将用户 id 发送到 PHP 文件

Android app 中,用户 id 未保存在 shared preferences 中,但我通过对 Facebook Account Kit (for authentication use Facebook Account kit 的请求获得了它。

所以当我需要用户 id 时,我从 Facebook Account Kit 请求它,我得到它并通过一个隐藏字段将它发送到 PHP 文件,我将稍后在 Query.

WHERE 子句中使用

现在,但是,出于安全原因,我更愿意使用 sessions 来保存用户 id,然后将用户 id 保留在 session .

我的一个朋友告诉我,如果黑客得到 sessionid,其中保存了用户 id,它可能已经过期并且他什么也得不到。

问题是我不明白如何保存 session IDuserID 以及如何在 database table 架构级别管理它们.

我必须将 session ID 保存在 database 中,我创建了一个名为“Sessions”的 table,其中包含 3 个字段:

要在 database 上插入用户 ID,我应该始终将其从应用程序传递到 PHP 文件,这样如果黑客可以发现用户 id,我认为他可以通过 WHERE 子句 ID_user = ID_user.

很好地获取有关 sessions 的信息

对吗?

如果我是对的,那么什么比我做的更安全?

然后如果 SessionID 随着每次访问而改变,要在 MySql 数据库的 Sessions table 中改变它我应该再次从 Android app 切换到 PHP 用户 id 并通过查询更新我应该更改 session id 和访问日期 ID_User = ID_UserWHERE 子句中。

准确吗?

如果有人对我有什么建议或批评我的处理方式并且有比我更好的解决方案,我愿意听取。

如果我对 session 的工作原理一无所知,请原谅我偷了你的时间。

谢谢。

PHP session 是基于 Cookie 的。当用户打开网页时,PHP 设置一个 cookie 作为响应。浏览器自动确保在后续请求中,该 cookie 也会在请求中发送,因此 $_SESSION 变量有效。在我看来,它们并没有提供太多的安全性。现在,恶意用户必须获取 Cookie,而不是用户 ID。 始终使用 HTTPS 来保护请求。

使用 Android 应用程序,您将发出自定义请求,因此您必须明确设置 cookie,一旦收到第一次调用(您必须将其保存在client-side;不是一个好方法)。

session通常的工作方式如下-

  1. 第一次使用 $_SESSION 设置值时,PHP 设置一个 Session cookie,它本质上是一个随机字符串。
  2. 在幕后(在后端),PHP 正在维护针对此字符串值的 Object(key-value 对)。 (SessionKey1 = { key: value, key2: value2 };这可能位于磁盘文件系统或缓存层(例如 Redis),具体取决于您的服务器配置)
  3. 当您 set/updated/delete session 中的一个键时, SessionKey1 被修改。

现在您可以为自己创建一个类似的行为。当在 Android 应用程序端找到 userId 时,将其发送到后端,在 session table 中创建一行(Session Id 为随机字符串,UserId 为 UserId)。对于每个请求,发送此 SessionId 连同请求(在 body 或 headers 中),在后端检查 sessionId 是否在 Session 中收到退出s table。如果是,获取用户ID并进行处理。

这是另一种方法(可能 a-bit 更安全)

Account Kit 验证后找到 Access Token 时

  • 发送到后端
  • 验证来自 Facebook APIs (Link)
  • 的令牌
  • 验证 API 还有 return 用户信息,将其映射到您的用户数据(来自 你的数据库结构)。

(这将确保令牌始终有效,用户将无法放置随机令牌进行攻击,因为这将无法通过 Facebook APIs 的验证)。

生成一个UUID,用

创建一行
  • UUID 为 sessionId,
  • 您的用户名
  • 访问数据
  • 创建于(创建行时)
  • 到期(当前时间 + X 天)

发送此 UUID 作为响应。

现在在 Android 端,将此 UUID 保存在某处。创建一个请求拦截器,为所有请求在自定义 header(例如 X-<application_name>-Auth)中设置此 UUID。在每个请求的后端,访问此 Header,检查它是否已过期,从您的 session table 获取用户 ID,然后继续。

I think he could very well get information about sessions with a WHERE clause ID_user = ID_user.

Quite right?

你完全正确。但是,保护数据库层应该是独立于应用程序开发的任务。您认为黑客如何能够首先执行查询?如果有人找到一种方法来 运行 数据库上的原始查询,那么他所造成的破坏可能比仅仅提取数据要大得多。

If I'm right, then what's safer than what I do?

没有正确答案,您只需要尽力确保应用程序的安全即可。确保您的应用程序遵循最佳安全实践。例如 - 使用 HTTPS,防止 SQL Injection.s(搜索 OWASP Vulnerabilities