我正在开发一个允许用户更改数据库连接的工具。 因此,用户有一个选择框,在那里他选择了所需的数据库。我总共有4个不同的数据库,但结构总体上是一样的,只有数据变化。
如果用户只使用1个打开标签,我没有任何问题。但是,如果用户使用少量选项卡,则可能会出现许多安全问题。
例如: 选项卡1 - 用户想要编辑数据库1中的行 同时,用户将Tab2更改为数据库3。 因此,当他要保存选项卡1时,它可能会保存到数据库3,因为它是最后一次更改。
我正在$ _SESSION var。
上保存所选数据库我的代码现在,我有一个用户选择数据库的表单。在_init.php上我有一个简单的开关案例,根据选定的数据库需要不同的config.php。
一些想法如何防止这样的错误发生?
答案 0 :(得分:0)
如果您将活动连接存储在$ _SESSION中,则无论您在浏览器中打开的标签数量是多少,都只能有一个活动连接,因为会话在标签之间共享。
相反,您可以为每个连接提供计数器或数字标识符:
示例:
1 = connection 1
2 = connection 2
...
如果用户从您的选择框更改连接,请使用重定向发送带有连接号的GET参数。
示例:
您需要始终通过GET或POST发送您的连接ID,并接收它而不是在$ _SESSION var中查找它。
希望有所帮助
答案 1 :(得分:0)
如果允许每个并发选项卡使用单独的数据库连接,那么每个并发选项卡将在向服务器发送请求时指定该信息。
这可以像在每个表单的隐藏字段中包含数据库的标识符一样简单。当用户在该页面上选择其他数据库时,请更新该隐藏字段。 (这里主要猜测“隐藏字段”结构,因为我们不知道你的表单是如何布局的。但重点是表单应该包含这个值。)
这成为一种整体更加RESTful的方法,从会话状态转向由页面本身驱动的状态转移。这通常是一件好事。
基本上,由于正在执行的操作请求(保存记录)需要知道保存位置,请在请求中包含该信息,而不是尝试在服务器端处理该信息。
答案 2 :(得分:0)
老实说,我会对你的问题采取不同的方法。
在服务器上设置子域,这些子域指向相同的Web文件夹并具有硬编码的数据库连接设置。
db1.example.com db2.example.com db3.example.com db4.example.com
现在,用户必须登录到正确的子域才能对所需的数据库执行操作,因此session_start()
实际上会为每个子域创建一个唯一的会话。
用户可以打开4个标签,而不必担心使用错误的数据库。
因此,您的db_config.php
文件可能如下所示:
switch($sub_domain)
{
case 'db1.example.com':
// Code for connecting to DB1
break;
case 'db2.example.com':
// Code for connecting to DB2
break;
case 'db3.example.com':
// Code for connecting to DB3
break;
case 'db4.example.com':
// Code for connecting to DB4
break;
}
至于创建用于选择数据库的<select>
框的想法,您可以实现一些JS来打开指向正确子域的新选项卡。