php - 如何在 PHP 和 MySql 中保存和管理 session ID 和用户 ID

标签 php android mysql session session-variables

我需要澄清我对 PHP 的疑问 sessions .

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

此时,我通过隐藏的 EditTextAndroid 将用户 id 发送到 PHP 文件应用程序

Android 应用 中,用户id 未保存在共享首选项 中,但我通过向 Facebook Account Kit 发出请求来获取它。 (用于身份验证,请使用 Facebook Account kit )。

因此,当我需要用户 id 时,我会从 Facebook Account Kit 请求它。 ,我得到它并通过隐藏字段将其发送到 PHP 文件,稍后我将在 QueryWHERE 子句中使用该文件.

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

我的一个 friend 告诉我,如果黑客获取了保存用户id session id,可能会发生它已经过期并且他无法得到任何东西的情况。

问题是我不明白如何保存 session ID用户ID以及如何在数据库中管理它们> 表架构级别。

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

  • Session_ID,
  • ID_User,
  • 数据访问。

要在数据库上插入用户ID,我应该始终将其从应用程序传递到PHP文件,因此如果黑客可以发现用户id,我认为他可以很好地通过WHERE子句ID_user = ID_user获取有关sessions的信息>.

完全正确吗?

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

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

准确吗?

如果有人对我有任何建议或对我处理情况的方式提出批评,并且有比我更好的解决方案,我会乐意倾听。

如果我对 session 的运作方式一无所知,请提前原谅我偷了你的时间。

无论如何,谢谢。

最佳答案

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

使用 Android 应用程序,您将发出自定义请求,因此您必须在从第一次调用收到后显式设置 cookie(您必须将其保留在客户端;不是好方法)。

session 的通常工作方式如下 -

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

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

这是一种替代方法(可能更安全)

Account Kit 验证后找到访问 token 时

  • 发送至后端
  • 验证来自 Facebook API 的 token ( Link )
  • 验证 API 还会返回用户信息,将其映射到您的用户数据(来自 您的数据库结构)。

(这将确保 token 始终有效,用户将无法放置随机 token 来进行攻击,因为这将导致 Facebook API 的验证失败)。

生成一个UUID,创建一行

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

发送此 UUID 作为响应。

现在在 Android 端,将此 UUID 保存在某处。创建一个请求拦截器,为所有请求在自定义 header 中设置此 UUID(例如 X-<application_name>-Auth )。在每个请求的后端,访问此 header ,检查它是否过期,从 session 表中获取用户 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 注入(inject)(搜索 OWASP Vulnerabilities )

关于php - 如何在 PHP 和 MySql 中保存和管理 session ID 和用户 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55781779/

相关文章:

php - 如何在 ng-repeat 中使用 ng-class 为每个迭代 div 设置类

android - youtube视频下载android

java - 滚动时 OnNestedScroll 值不改变

php - 从另一个选择中选择一个条目

mysql - WordPress 自定义类型帖子下一个上一个连接表

php - PHP INSERT 到 MySQL 数据库的问题

php - 小数点的百分比? PHP

Javascript - 未捕获的类型错误 : Cannot read property 'value' of undefined

php - 无法显示由 fine-uploader 上传到 Amazon s3 的图像

java - map 在 Nexus 5X API 28 中崩溃,但在 Google PIXEL 2 XL API 27 中运行完美