【问题标题】:How to securely connect to MySQL database on another server?如何安全地连接到另一台服务器上的 MySQL 数据库?
【发布时间】:2019-10-16 02:45:16
【问题描述】:

我正在尝试将我的 Discord 机器人与另一台服务器上的 MySQL 数据库链接。然而,这个例子显然是不安全的:

const mysql = require('mysql');
const connection = mysql.createConnection({
  host     : 'hostname',
  port     : 'portnum',
  user     : 'db_user',
  password : 'db_user_password',
  database : 'db_name',
  charset  : 'utf8mb4'
});

我将如何建立(更)安全的连接?

【问题讨论】:

  • 您的问题过于宽泛,无法在此回答。如果您想了解更多关于 Javascript 的信息,我建议您 Mozilla's guide。如果您想了解更多关于节点的信息,请参阅its documentation。如果您想了解有关mysql npm 模块的更多信息,请参阅its documentation

标签: javascript mysql node.js database discord.js


【解决方案1】:

您可以使用 SSL 进行连接,如下所示:

const fs = require('fs');
const mysql = require('mysql');
const connection = mysql.createConnection({
  host     : 'hostname',
  port     : 'portnum',
  user     : 'db_user',
  password : 'db_user_password',
  database : 'db_name',
  charset  : 'utf8mb4',
  ssl: {
      ca: fs.readFileSync(__dirname + '/certs/ca.pem'),
      key: fs.readFileSync(__dirname + '/certs/client-key.pem'),
      cert: fs.readFileSync(__dirname + '/certs/client-cert.pem')
  }
});

您还必须在 MySql 服务器上启用 SSL。网上有一些 tutorials 显示如何操作,但您需要 root 访问权限才能执行此操作。

【讨论】:

    【解决方案2】:

    如果它是一个托管数据库服务器,并且您拥有安全端点 URL(即 https:// 主机),那么只需将其用作主机名 host: 'hostname' 就足够了。

    如果它是您拥有的私人服务器并且您拥有 SSL 证书,那么您可以使用以下内容:

    const fs = require('fs');
    const mysql = require('mysql');
    
    var connection = mysql.createConnection({
        host: '127.0.0.1',
        port: '3306',
        user: 'root',
        password: 'passw0rd',
        database: 'test',
        ssl: {
            ca: fs.readFileSync(__dirname + '/certs/ca.pem'),
            key: fs.readFileSync(__dirname + '/certs/client-key.pem'),
            cert: fs.readFileSync(__dirname + '/certs/client-cert.pem')
        }
    });
    
    connection.connect();
    

    【讨论】:

    • 它有SSL证书,但我不拥有物理服务器,只有使用它的权利。正如我在下面所说的,服务器与可公开访问的服务器 (www.emirates-virtual.com) 相同。
    • 如果它阻止解决方案工作,您可能需要编辑问题以包含该问题。
    【解决方案3】:

    这并不是真的不安全。你有几个选择。首先,专用网络上的服务器是否位于防火墙后面?还是他们只能通过公共 IP 地址相互连接?如果前者是真的,那你很好。但是,我会在服务器上添加防火墙规则,以便它只允许来自另一台机器的连接。如果他们在公共 IP 地址上连接,您需要做同样的事情并且还为 MySQL 使用非标准端口。您还可以添加另一个 NIC 并将 MySQL 服务绑定到该 NIC。这样,如果黑客发现您的服务器,它似乎所有端口都已关闭。

    【讨论】:

    • 服务器与可公开访问的服务器 (www.emirates-virtual.com) 相同。
    • 你在运行 Ubuntu 吗?如果有,是什么版本?另外,这些是专用服务器还是虚拟服务器?您将无法在共享环境中执行此操作。最后,你有root权限吗?
    • 我认为正在运行的服务器正在运行 Linux,但我会找到版本。我有 root 访问权限,但我不确定服务器是虚拟的还是专用的。我会联系房东了解
    • 酷。告诉我。
    • 你好,我发现服务器是专用服务器
    猜你喜欢
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多