保持用户特定会话信息安全的最佳方法

时间:2013-12-31 07:38:10

标签: php mysql session

我使用PHP / MySQL开发一些东西。架构是这样的,每个用户将拥有自己的(不同的)数据库名称,在该数据库中,每个用户都会调用相同的表。所以基本上如果“坏”用户可以将他的数据库名称切换到其他人 - 他可以访问某人的数据意味着安全性被破坏。

  • 在我的案例中保留此类用户特定数据的最佳方法是什么?
  • 但我猜答案是$_SESSION超全球?如果是这样有多安全?用户(httponly)可以更改$_SESSION中存储的变量的值吗?特别是如果我在那里保持简单的db_name?或者,如果我对它的偏执,我应该哈希那个db_name - >保持会话 - >读它 - >在服务器端unhash - >给用户他的数据库?如果有任何好的建议我可以使用加密/解密? (我不知道tbh)

很多问题,但它们都很窄 - 提前谢谢你们!

编辑:我担心我没有正确解释自己:

通过不同的数据库(或数据库名称),我的意思是相同的MySQL实例,内部只是不同的数据库(就{SQL语言而言CREATE DATABASE "sec_login"; USE "sec_login";而言),所以例如我将拥有以下数据库:

  • sec_l​​ogin(包含表:members,loging_attempts等。)
    ......
  • db_user1
  • db_user2
    ...
  • db_user1001

所以每当例如user2登录当user1001到达$db_name = db_user2;时它获取$db_name = db_user1001;,然后程序将使用与这些数据库中的表相同的逻辑为它们提供服务。

所以是的,我的问题是在这种情况下保留$db_name = db_user2;的价值 谢谢@ Nathan Hazout我得到了关于$_SESSION被保留在哪里的答案。并感谢一个很好的链接!第二次阅读时有用并加书签:)

关于安全:我完全同意“......尽可能安全”。但只是想知道“坏”用户可以访问别人$_SESSION的几率。如果我错了,请纠正我 - 在$_SESSION窃取其他变量与盗取其他session_id相同,对吗?

3 个答案:

答案 0 :(得分:1)

存储在$_SESSION变量中的数据将保留在您的服务器上,而不是Cookie中,如果您担心的话。存储在客户端的只是会话ID,一种标识符,因此您的服务器将知道要加载哪个$_SESSION数据。

参见例如Is my understanding of PHP sessions correct?

话虽这么说,你的代码只是和你做的一样安全。

我不会全面介绍“每个用户都有自己的(不同的)数据库名称”,我根本不理解你选择的架构......

答案 1 :(得分:1)

如果添加用户表,则用户可拥有的任何实体都只能获得user_id外键。我听说有些金融公司坚持使用分离的数据库(出于偏执的安全原因),但总的来说只有一个数据库是一个更好的主意。这意味着提取系统范围的元信息(例如“哪个用户执行最多的事务?”)要容易得多 - 如果您有单独的数据库,则可能无法在表之间进行必要的连接。

一般情况下,用户无法更改$_SESSION超全局的内容,但您需要检查您的代码是否不具备这种能力!因此,我不打扰哈希的事情(从技术上讲,没有什么可以解开 - 你可能会考虑加密)。

答案 2 :(得分:0)

我猜你有理由为每个用户提供不同的db,我以为我从未听说过这种架构。无论如何,不​​要在会话中存储数据库名称,存储一些标识用户的哈希值,保存一般数据库中的用户表,当用户登录时将当前会话ID放在此用户表中,这样当用户为您提供会话ID时,您从此表中获取数据库名称。很难猜测会话id导致其随机字符序列。