访问不同的数据库,防止用户错误PHP

时间:2016-03-04 14:43:12

标签: javascript php postgresql security

我正在开发一个允许用户更改数据库连接的工具。 因此,用户有一个选择框,在那里他选择了所需的数据库。我总共有4个不同的数据库,但结构总体上是一样的,只有数据变化。

如果用户只使用1个打开标签,我没有任何问题。但是,如果用户使用少量选项卡,则可能会出现许多安全问题。

例如: 选项卡1 - 用户想要编辑数据库1中的行 同时,用户将Tab2更改为数据库3。 因此,当他要保存选项卡1时,它可能会保存到数据库3,因为它是最后一次更改。

我正在$ _SESSION var。

上保存所选数据库

我的代码现在,我有一个用户选择数据库的表单。在_init.php上我有一个简单的开关案例,根据选定的数据库需要不同的config.php。

一些想法如何防止这样的错误发生?

3 个答案:

答案 0 :(得分:0)

如果您将活动连接存储在$ _SESSION中,则无论您在浏览器中打开的标签数量是多少,都只能有一个活动连接,因为会话在标签之间共享。

相反,您可以为每个连接提供计数器或数字标识符:

示例:

1 = connection 1
2 = connection 2
...

如果用户从您的选择框更改连接,请使用重定向发送带有连接号的GET参数。

示例:

  • 如果我选择连接1,浏览器会重定向到index.php?cn = 1
  • 如果在另一个标签中我使用连接2,浏览器会将我重定向到index.php?cn = 2

您需要始终通过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来打开指向正确子域的新选项卡。