如何在PHP和MySql中保存和管理会话ID和用户ID
我需要澄清我对如何在PHP和MySql中保存和管理会话ID和用户ID,php,android,mysql,session,session-variables,Php,Android,Mysql,Session,Session Variables,我需要澄清我对PHP的疑问 我正在创建一个Android应用程序,在某些活动中,我需要进行查询以提取用户数据 此时,我通过Android应用程序中的隐藏EditText将用户id发送到PHP文件 在Android应用程序中,用户id未保存在共享首选项中,但我通过请求获得它(用于身份验证) 因此,当我需要用户id时,我从中请求它,获取它并通过一个隐藏字段将其发送到PHP文件,稍后我将在查询的WHERE子句中使用该文件 但是,现在出于安全原因,我更愿意使用保存用户id,然后将用户id保留在会话中 我
PHP
的疑问
我正在创建一个Android应用程序
,在某些活动中,我需要进行查询以提取用户数据
此时,我通过Android应用程序中的隐藏EditText
将用户id
发送到PHP
文件
在Android应用程序
中,用户id
未保存在共享首选项
中,但我通过请求获得它(用于身份验证)
因此,当我需要用户id
时,我从中请求它,获取它并通过一个隐藏字段将其发送到PHP
文件,稍后我将在查询的WHERE
子句中使用该文件
但是,现在出于安全原因,我更愿意使用保存用户id
,然后将用户id
保留在会话中
我的一位朋友告诉我,如果黑客获得了会话
的id
,在该会话中用户id
被保存,那么可能发生的情况是,该id已经过期,他什么也得不到
问题是我不知道如何保存会话ID
和用户ID
以及如何在数据库
表体系结构级别管理它们
我必须在数据库中保存会话ID
,我创建了一个名为“会话
”的表,其中包含3个字段:
- 会话ID
- ID\u用户
- 数据访问
要在数据库中插入用户ID
,我应该始终将其从应用程序传递到PHP
文件,因此如果黑客能够发现用户ID
,我认为他可以通过WHERE
子句ID\u user=ID\u user
获得有关会话的信息
完全正确
如果我是对的,那么还有什么比我做的更安全呢
然后,如果会话的ID
随每次访问而更改,要在MySql
数据库的Sessions
表中更改它,我应该再次从Android应用程序切换到PHP
用户id
,通过查询更新,我应该在WHERE
子句中使用id\u user=id\u user
更改会话id
和访问日期
准确吗
如果有人对我的处理方式有任何建议或批评,并且有比我更好的解决方案,我会乐意倾听
如果我不了解这些课程是如何进行的,那么请原谅我偷了你的时间
谢谢。PHP会话基于Cookies。当用户打开网页时,PHP会设置一个cookie作为响应。浏览器会自动确保在后续请求中,cookie也会在请求中发送,因此$\u会话变量有效。在我看来,他们没有提供太多的安全。而不是用户Id,现在一个恶意用户必须得到他的手上的Cookies始终使用HTTPS保护请求。
使用Android应用程序,您将发出一个定制请求,因此您必须明确地设置cookie,一旦从第一次调用收到cookie(您必须在客户端保留cookie;这不是一个好方法)
会议的通常工作方式如下-
当第一次使用$\u SESSION设置值时,PHP会设置一个会话cookie,它本质上是一个随机字符串
在后台,PHP根据这个字符串值维护一个对象(键值对)。(SessionKey1={key:value,key2:value2}
;这可能在磁盘文件系统或缓存层(例如Redis)上,具体取决于您的服务器配置)
在会话中设置/更新/删除密钥时,SessionKey1
会被修改
现在,您可以为自己创建类似的行为。当在Android应用程序端找到userId时,将其发送到后端,在会话表中创建一行(会话Id为随机字符串,userId为userId)。对于每个请求,将此SessionId与请求一起发送(在正文或标题中),在后端检查SessionId是否已收到,并在Sessions表中退出。如果是,则获取用户Id和进程
这里有一种替代方法(可能更安全一点)
在帐户套件验证后找到访问令牌时
- 发送到后端
- 验证Facebook API()中的令牌
- 验证API还返回用户信息,将其映射到用户的数据(从
您的数据库结构)
(这将确保令牌始终有效,用户将无法放置随机令牌进行攻击,因为这将无法通过Facebook API的验证)
生成UUID,使用
- UUID作为sessionId
- 您的用户ID
- 访问数据
- 创建时间(创建行时)
- 到期日(当前时间+X天)
发送此UUID作为响应
现在在Android端,将这个UUID保存到某个地方。为所有在自定义头中设置此UUID的请求创建一个请求拦截器(例如X--Auth
)。在每个请求的后端,访问此标头,检查它是否已过期,从会话表中获取用户Id,然后继续
我认为他可以很好地获得关于WHERE子句ID\u user=ID\u user会话的信息
完全正确
你完全正确。但是,保护DB层的安全应该是与应用程序开发分开的任务。你认为黑客一开始是如何执行查询的?如果有人找到一种在数据库上运行原始查询的方法,那么他可能会比仅仅提取数据造成更大的损害
如果我是对的,那么还有什么比我做的更安全呢
没有正确的答案,您只需尽力保护应用程序。确保您的应用程序符合以下要求