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

时间:2019-04-21 10:08:55

标签: php android mysql session session-variables

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

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

目前,我通过id中隐藏的PHP将用户EditText发送到Android app文件。

Android app中,用户id未被保存在shared preferences中,但是我是通过向Facebook Account Kit的请求获得的(用于身份验证时,使用Facebook Account kit

因此,当我需要用户id时,我从Facebook Account Kit请求它,并通过一个隐藏字段将其发送到PHP文件,稍后将使用在WHERE的{​​{1}}子句中。

但是,出于安全原因,现在,我宁愿使用sessions保存用户Query,然后将用户id保留在id中。 / p>

我的一个朋友告诉我,如果黑客从session的{​​{1}}中保存了用户id,他可能已经过期并且他什么都收不到。

问题是我不了解如何保存sessionid ID以及如何在session ID表体系结构级别上对其进行管理。

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

  • 会话ID,
  • ID_User,
  • 数据访问。

要在database上插入用户Sessions,我应该始终将其从应用程序传递到ID文件,因此,如果黑客可以发现用户database ,我认为他可以通过PHP子句id获得有关sessions的信息。

很正确吗?

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

然后,如果WHERE中的ID_user = ID_user随每次访问而改变,要在ID数据库的Session表中对其进行更改,我应该从{{1 }}再次Sessions用户MySql,并通过查询更新,我应该在Android app子句中使用PHP更改会话id和访问日期。

是吗?

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

如果我对会议的工作方式一无所知,请在我偷走你的时间之前先对不起。

还是谢谢。

1 个答案:

答案 0 :(得分:2)

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

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

会话的通常工作方式如下-

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

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

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

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

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

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

生成一个UUID,使用

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

发送此UUID作为响应。

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

  

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

     

很正确吗?

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

  

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

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