我使用PHP / MySQL开发一些东西。架构是这样的,每个用户将拥有自己的(不同的)数据库名称,在该数据库中,每个用户都会调用相同的表。所以基本上如果“坏”用户可以将他的数据库名称切换到其他人 - 他可以访问某人的数据意味着安全性被破坏。
$_SESSION
超全球?如果是这样有多安全?用户(httponly)可以更改$_SESSION
中存储的变量的值吗?特别是如果我在那里保持简单的db_name?或者,如果我对它的偏执,我应该哈希那个db_name - >保持会话 - >读它 - >在服务器端unhash - >给用户他的数据库?如果有任何好的建议我可以使用加密/解密? (我不知道tbh)很多问题,但它们都很窄 - 提前谢谢你们!
编辑:我担心我没有正确解释自己:通过不同的数据库(或数据库名称),我的意思是相同的MySQL实例,内部只是不同的数据库(就{SQL语言而言CREATE DATABASE "sec_login"; USE "sec_login";
而言),所以例如我将拥有以下数据库:
所以每当例如user2登录当user1001到达$db_name = db_user2;
时它获取$db_name = db_user1001;
,然后程序将使用与这些数据库中的表相同的逻辑为它们提供服务。
所以是的,我的问题是在这种情况下保留$db_name = db_user2;
的价值
谢谢@ Nathan Hazout我得到了关于$_SESSION
被保留在哪里的答案。并感谢一个很好的链接!第二次阅读时有用并加书签:)
关于安全:我完全同意“......尽可能安全”。但只是想知道“坏”用户可以访问别人$_SESSION
的几率。如果我错了,请纠正我 - 在$_SESSION
窃取其他变量与盗取其他session_id相同,对吗?
答案 0 :(得分:1)
存储在$_SESSION
变量中的数据将保留在您的服务器上,而不是Cookie中,如果您担心的话。存储在客户端的只是会话ID,一种标识符,因此您的服务器将知道要加载哪个$_SESSION
数据。
参见例如Is my understanding of PHP sessions correct?
话虽这么说,你的代码只是和你做的一样安全。
我不会全面介绍“每个用户都有自己的(不同的)数据库名称”,我根本不理解你选择的架构......
答案 1 :(得分:1)
如果添加用户表,则用户可拥有的任何实体都只能获得user_id
外键。我听说有些金融公司坚持使用分离的数据库(出于偏执的安全原因),但总的来说只有一个数据库是一个更好的主意。这意味着提取系统范围的元信息(例如“哪个用户执行最多的事务?”)要容易得多 - 如果您有单独的数据库,则可能无法在表之间进行必要的连接。
一般情况下,用户无法更改$_SESSION
超全局的内容,但您需要检查您的代码是否不具备这种能力!因此,我不打扰哈希的事情(从技术上讲,没有什么可以解开 - 你可能会考虑加密)。
答案 2 :(得分:0)
我猜你有理由为每个用户提供不同的db,我以为我从未听说过这种架构。无论如何,不要在会话中存储数据库名称,存储一些标识用户的哈希值,保存一般数据库中的用户表,当用户登录时将当前会话ID放在此用户表中,这样当用户为您提供会话ID时,您从此表中获取数据库名称。很难猜测会话id导致其随机字符序列。