mysql - 在我的数据库中保存用户数据库连接
问题描述
我正在开发一个应用程序,我必须在其中创建与我自己的数据库的连接,以及与用户必须在自己的注册中提供的访问信息的数据库连接。
我们正在开发一个独特的应用程序,该应用程序应该服务于多个客户,在后端使用带有 typeORM 的节点。
我知道对于我的连接,我可以使用我自己的应用程序中的 .env。
但是用户提供的连接,我知道我无法在数据库中使用纯文本保存。
所以问题是:把它保存到mysql数据库可以吗?
如何以最安全的方式保存这些数据?
解决方案
您的系统设计存在一些不寻常的信息安全隐患。它具有比平常更大的攻击面,因为它要求您的客户将他们的 MySQL 服务器暴露给来自您的服务器的连接。如果您的服务器可以进入,那么网络爬虫也可能更容易进入。如果他们的数据很敏感,他们可能会要求您使用他们的环境和您的环境之间的始终在线 VPN 隧道访问他们的服务器。怎么做?超出堆栈溢出答案的范围。
您可以采取一些措施使其更安全。
首先,让您的客户要求从您的 nodejs 程序到客户提供的 MySQL 实例的ssl 加密 MySQL 连接。您不希望您的客户数据在没有加密的情况下通过公共网络移动,因为您不希望网络窃贼拦截或更改它。这需要您的客户配置他们的服务器以支持 TLS。
其次,告诉您的客户在他们的服务器上创建 MySQL 帐户,专门供您的应用程序使用。这些帐户应具有您的应用运行所需的最低权限。要求您的客户限制这些帐户对您的服务器的访问。例如,如果您的服务器的 IP 地址是192.0.2.123
, 192.0.2.124
,192.0.2.125
您可以要求他们创建这样的帐户:
CREATE USER 'rodrigo'@'192.0.2.123' IDENTIFIED BY 'hardToGuess' REQUIRE SSL;
CREATE USER 'rodrigo'@'192.0.2.124' IDENTIFIED BY 'hardToGuess' REQUIRE SSL;
CREATE USER 'rodrigo'@'192.0.2.125' IDENTIFIED BY 'hardToGuess' REQUIRE SSL;
GRANT SELECT,INSERT,UPDATE,DELETE ON rodrigoAppDb.* TO
'rodrigo'@'192.0.2.123',
'rodrigo'@'192.0.2.124',
'rodrigo'@'192.0.2.125';
FLUSH PRIVILEGES;
第三,让我们利用关于应用程序密码验证的事实。如果您正确地进行密码身份验证,那么您唯一可以访问用户的未哈希登录密码的时间是当他们从您的登录表单中将它们发布给您并检查它们时。因为您对用户的密码进行哈希处理,所以它们不会以可用的形式存储在您的 MySQL 数据库中。
这意味着您可以使用他们的登录密码(他们的纯文本登录密码本身,而不是他们的登录密码的哈希值)作为他们的密钥来加密您的客户的 MySQL 密码。这样您就不必存储这些密码的文本。您需要在登录过程中检索和解密他们的 MySQL 密码。然后,您可以为每个用户的 MySQL 数据库打开一个连接池,以便在该用户的会话期间使用。(请务必为每个池设置较短的过期时间,以便在您的用户离开后它会很快消失。)
请注意:当您的用户更改他们的密码时,您将不得不更新他们的密码哈希并重新加密他们的数据库密码。这意味着您必须在密码更新页面上提示输入用户的现有密码和新密码。
同样,您需要一个接受每个用户的 MySQL 连接数据的屏幕。在该屏幕上,您还必须重新向系统请求用户密码。
推荐阅读
- c++ - 即使函数已经存在,C++ 未定义的函数引用错误
- java - admob SettingEnabled false
- typo3-9.x - 错字3 Bootstrap 包子导航左侧
- python - 如何将变量“s”传递给 is_fl_vowel() 方法?
- python - 使用 Django 和单个网页模板将网页内容存储在数据库中的最佳方式
- sql-server - 排除历史记录表中的列
- swiftui - 如何使用 SwiftUI 禁用/修改按钮?
- c# - 如何在 ASP.NET Core 中将没有文件名的多部分/表单数据文件绑定到 IFormFile
- c# - Asp.net Core Razor 页面从 _layout 发布
- reactjs - NPX create-react-app 找不到 @typescript-eslint/experimental-utils@2.19.1 的匹配版本