Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP和MySql中保存和管理会话ID和用户ID_Php_Android_Mysql_Session_Session Variables - Fatal编程技术网

如何在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层的安全应该是与应用程序开发分开的任务。你认为黑客一开始是如何执行查询的?如果有人找到一种在数据库上运行原始查询的方法,那么他可能会比仅仅提取数据造成更大的损害

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

    没有正确的答案,您只需尽力保护应用程序。确保您的应用程序符合以下要求