为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
哔哔one 2021-04-27 22:22:49
我需要澄清对PHP 会议的疑问。我正在创建Android app,在某些活动中我需要进行查询以提取用户数据。目前,这样做,我将用户发送id到PHP通过隐藏文件EditText从Android app。在Android app用户id不保存在shared preferences,但我得到它通过对一个请求的Facebook帐户试剂盒(用于认证使用Facebook的账户套件)。因此,当我需要用户时id,可以从Facebook Account Kit中请求它,然后通过一个隐藏字段将其发送到PHP文件中,该文件将在稍后的WHERE子句中使用Query。但是,出于安全原因,现在,我希望使用会话来保存用户id,然后将用户保留id在中session。我的一个朋友告诉我,如果一个黑客获取id的session,用户在其中id保存,它可以发生,它已经过期,他不能得到任何东西。问题是我不了解如何保存session ID和userID以及如何在database表体系结构级别上对其进行管理。我必须将保存在session ID中database,我创建了一个名为“ Sessions”的表,其中包含3个字段:会话ID,ID_User,数据访问。要插入用户ID的database我应该始终从应用程序传递到PHP文件,因此,如果一个黑客可以发现用户id,我认为他很可能获得有关信息sessions与WHERE条款ID_user = ID_user。完全正确?如果我是对的,那有什么比我做的事更安全的呢?那么如果ID的Session每个接入的改变,要改变它在Sessions表中的MySql数据库,我应该从交换机Android app到PHP用户再次id通过查询更新我应该改变会话id与和访问的日期ID_User = ID_User中WHERE的条款。精确的?如果有人对我有任何建议或对我如何处理情况提出批评,并且比我的有更好的解决方案,那么我会乐于听。如果我对会议的工作方式一无所知,请原谅我从你那里偷走的时间。不管怎么说,还是要谢谢你。
查看完整描述

1 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

PHP会话基于Cookies。当用户打开网页时,PHP会设置一个cookie作为响应。浏览器会自动确保在后续请求中,也会在请求中发送cookie,因此$ _SESSION变量起作用。我认为,它们不能提供太多的安全性。现在,恶意用户必须使用Cookie来代替用户ID。始终使用HTTPS来保护请求。

使用Android应用程序时,您将要进行自定义请求,因此,一旦收到第一次调用,就必须明确设置cookie(您必须将其保留在客户端;这不是一个好方法) 。

会议的通常工作方式如下:

  1. 首次使用$ _SESSION设置值时,PHP会设置一个会话cookie,该会话cookie本质上是一个随机字符串。

  2. 在后台(在后端)中,PHP将针对此字符串值维护一个对象(键-值对)。(SessionKey1 = { key: value, key2: value2 };这可能在磁盘文件系统上或在缓存层(例如Redis)上,具体取决于您的服务器配置)

  3. 当您设置/更新/删除会话中的密钥时,将SessionKey1被修改。

现在,您可以为自己创建类似的行为。在Android App端找到userId时,将其发送到后端,在会话表中创建一行(会话ID为随机字符串,用户ID为UserId)。对于每个请求,请在后端将这个SessionId与请求(在正文或标头中)一起发送,然后在Sessions表中检查是否收到了sessionId退出。如果是,请获取用户ID并进行处理。

这是另一种方法(可能有点安全)

帐户工具包验证后找到访问令牌时

  • 发送给后端

  • 从Facebook API验证令牌(链接

  • 验证API还会返回用户信息,并将其映射到您的用户数据(来自数据库结构)。

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

生成一个UUID,用

  • UUID作为sessionId,

  • 您的userId

  • 存取资料

  • 创建时间(创建行时)

  • 到期时间(当前时间+ X天)

发送此UUID作为响应。

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

我认为他可以很好地获取有关带有WHERE子句ID_user = ID_user的会话的信息。

完全正确?

你是绝对正确的。但是,保护数据库层应该是与应用程序开发分开的任务。您如何看待黑客能够首先执行查询?如果人们找到了一种在数据库上运行原始查询的方法,那么他所造成的损失将不仅仅是提取数据。

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

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


查看完整回答
反对 回复 2021-05-07
  • 1 回答
  • 0 关注
  • 183 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信