我需要澄清对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
,他可能已经过期并且他什么都收不到。
问题是我不了解如何保存session
和id
ID以及如何在session ID
表体系结构级别上对其进行管理。
我必须将user
保存在database
中,然后创建一个名为“ session ID
”的表,其中包含3个字段:
要在database
上插入用户Sessions
,我应该始终将其从应用程序传递到ID
文件,因此,如果黑客可以发现用户database
,我认为他可以通过PHP
子句id
获得有关sessions
的信息。
很正确吗?
如果我是对的,那有什么比我做的事更安全?
然后,如果WHERE
中的ID_user = ID_user
随每次访问而改变,要在ID
数据库的Session
表中对其进行更改,我应该从{{1 }}再次Sessions
用户MySql
,并通过查询更新,我应该在Android app
子句中使用PHP
更改会话id
和访问日期。
是吗?
如果有人对我有任何建议或批评我如何处理这种情况,并且比我的解决方案更好,我会乐于听。
如果我对会议的工作方式一无所知,请在我偷走你的时间之前先对不起。
还是谢谢。
答案 0 :(得分:2)
PHP会话基于Cookies。当用户打开网页时,PHP会设置一个cookie作为响应。浏览器会自动确保在后续请求中,也会在请求中发送cookie,因此$ _SESSION变量起作用。我认为,它们不能提供太多的安全性。现在,恶意用户必须使用Cookie来代替用户ID。 始终使用HTTPS来保护请求。
使用Android应用程序时,您将要进行自定义请求,因此,一旦收到第一个调用,便必须明确设置cookie(您必须将其保留在客户端;好方法)。
会话的通常工作方式如下-
SessionKey1 = { key: value, key2: value2 }
;它可能在磁盘文件系统上或在缓存层(例如Redis)上,具体取决于您的服务器配置)SessionKey1
被修改。 现在,您可以为自己创建类似的行为。在Android App端找到userId后,将其发送到后端,在会话表中创建一行(会话ID为随机字符串,用户ID为UserId)。对于每个请求,请在后端将这个SessionId与请求(在正文或标头中)一起发送,检查在sessions表中是否接收到sessionId退出。如果是,请获取用户ID并进行处理。
这是另一种方法(可能更安全)
在验证帐户工具包后找到访问令牌
(这将确保令牌始终有效,用户将无法放置随机令牌来进行攻击,因为这将无法通过Facebook API进行验证。)
生成一个UUID,使用
创建一行发送此UUID作为响应。
现在在Android端,将此UUID保存在某处。创建一个请求拦截器,为所有请求在自定义标头中设置此UUID(例如X-<application_name>-Auth
)。在每个请求的后端,访问此标头,检查其是否过期,从会话表中获取用户ID,然后继续。
我认为他可以很好地获取有关带有WHERE子句ID_user = ID_user的会话的信息。
很正确吗?
您绝对正确。但是,保护数据库层应该是与应用程序开发分开的任务。您如何看待黑客能够首先执行查询?如果人们找到了一种在数据库上运行原始查询的方法,那么他所造成的损失将不仅仅是提取数据。
如果我是对的,那有什么比我做的事更安全?
没有正确的答案,您只需要尽力保护应用程序安全即可。确保您的应用程序遵循最佳安全实践。例如-使用HTTPS,以防止SQL注入。(搜索OWASP Vulnerabilities
)