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


Access to different databases, prevent user errors PHP

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

如果用户只使用 1 个打开的选项卡,我没有任何问题。但是如果用户使用很少的选项卡,可能会发生很多安全问题。

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

我将选定的数据库保存在 $_SESSION var 上。

我现在的代码,我有一个用户选择数据库的表单。在_init.php我有一个简单的开关案例,需要不同的配置.php具体取决于所选数据库。

一些想法如何防止此类错误的发生?

如果将

活动连接存储在 $_SESSION 中,则在跨选项卡共享会话时,无论您在浏览器中打开多少个选项卡,都只能有一个活动连接。

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

例:

1 = connection 1
2 = connection 2
...

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

例:

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

您将始终需要通过 GET 或 POST 发送您的连接 ID,并接收它,而不是在您的 $_SESSION var 中查找它。

希望对你有帮助

如果允许每个并发选项卡使用单独的数据库连接,则每个并发选项卡在向服务器发布请求时都需要指定该信息。

这可以像在每个表单的隐藏字段中包含数据库的标识符一样简单。 当用户在该页上选择其他数据库时,请更新该隐藏字段。 (主要是猜测这里的"隐藏字段"结构,因为我们不知道您的表单是如何布局的。 但关键是表单应包含此值。

这成为一种整体上更 REST 的方法,从会话状态转向由页面本身驱动的状态传输。 总的来说,这是一件好事。

基本上,由于对正在执行的操作(保存记录)的请求需要知道将其保存在哪里,因此请将该信息包含在请求本身中,而不是试图在服务器端处理该信息。

老实说,我会对你的问题采取不同的方法。

在服务器上设置子域,这些子域指向完全相同的 Web 文件夹,并具有硬编码的数据库连接设置。

db1.example.comdb2.example.comdb3.example.comdb4.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来打开指向正确子域的新选项卡。