【发布时间】:2014-01-18 04:14:52
【问题描述】:
我使用 PHP/MySQL 开发了一些东西。架构是这样的,每个用户都有自己的(不同的)数据库名称,在该数据库中,每个人都调用相同的表。所以基本上,如果“坏”用户可以将他的数据库名称切换到其他人 - 他可以访问某人的数据意味着安全受到破坏。
- 保存此类用户特定数据的最佳方式是什么,例如在我的情况下是他的数据库名称?
- 但我想答案将是
$_SESSIONsuperglobal ?如果是这样,它有多安全?用户(仅限http)可以更改存储在$_SESSION中的变量的值吗?特别是如果我在那里保留简单的 db_name ?或者,如果我对此感到偏执,我应该散列那个 db_name -> 将其保留在会话中 -> 读取它 -> 在服务器端取消散列 -> 给用户他的数据库?如果有什么好的建议我可以使用什么加密/解密? (我不知道)
很多问题,但都非常狭窄 - 提前谢谢您!
编辑:恐怕我没有正确解释自己:
不同的数据库(或数据库名称)是指相同的 MySQL 实例,只是内部的不同数据库(如 SQL 语言中的 CREATE DATABASE "sec_login"; USE "sec_login";),例如,我将拥有以下数据库:
- sec_login(包含表:成员、loging_attempts 等)
... - db_user1
- db_user2
... - db_user1001
所以每当例如user2 登录它会在 user1001 来到$db_name = db_user1001; 时得到他的$db_name = db_user2;,然后程序将为他们提供与这些数据库中的表相同的逻辑。
所以是的,我的问题是在这种情况下,$db_name = db_user2; 的值应该保存在哪里
谢谢@Nathan Hazout 我得到了你关于$_SESSION 被保存在哪里的答案。并感谢一个很好的链接!有用并为第二次阅读添加书签:)
关于安全:我完全同意“……尽你所能”。但只是想知道“坏”用户可以访问其他人的$_SESSION 的可能性有多大。如果我错了,请纠正我 - 在$_SESSION 中窃取其他变量与窃取其他 session_id 相同,对吧?
【问题讨论】:
-
each user will have own (different) DB name,一个非常糟糕的设计!改变它! -
我认为您的问题第一次就被很好地理解了。让一个 MySQL 实例只运行一个数据库。将您将在多个数据库中拆分的所有成员放在一个
members表中,然后添加一个外键来存储所有权。不幸的是,您提出的设计会让您陷入困境!