在命令行上使用 MySQL 密码的安全替代方法是什么?

在命令行上使用 MySQL 密码的安全替代方法是什么?

我们有一个 PHP 命令行脚本来控制数据库的版本。每当开发人员添加新的数据库补丁时,我们都会运行此脚本。

该脚本使用 MySQL 命令行运行补丁:

system('mysql --user=xxx --password=xxx < patch.sql');

但是,MySQL 5.6 现在发出以下警告:

警告:在命令行界面上使用密码可能不安全

这显然是正确的,但对于用户来说这可能是也可能不是一个问题。

  • 什么是安全的那么还有什么选择呢?
  • 或者,是否可以禁用此警告?

请注意,我不想依赖外部密码文件。

答案1

在最近的 MySQL GA 版本中,即版本 5.6,您可以通过 mysql_config_editor 命令执行此操作,如http://dev.mysql.com/doc/refman/5.6/en/mysql-config-editor.html

它基本上所做的是:使用主机别名加密您的用户/密码凭据,然后使用主机别名,将此信息放入主目录中的配置文件中,然后,当您需要它时,而不是执行以下操作:

mysqldump -uroot --password=mycleartextpass mydatabase > dumpfile.sql

你改为写:

mysqldump --login-path=myhostalias mydatabase > dumpfile.sql

从而避免将密码以明文形式放入某些脚本中。

为了使其工作,您首先必须(仅一次)定义myhostalias为:

mysql_config_editor set --login-path=myhostalias --host=mysqlhost.localnet.com --user=root --password

您可以根据需要为不同的帐户和/或主机使用不同的登录路径。我认为这是一个好主意。

需要注意的是,我相信这个功能确实不是存在于 5.6 以下的任何版本中。

答案2

使用--defaults-file--defaults-extra-file选项。您可以在其中指定用户 ID 和密码。其格式与 相同/etc/my.cnf

进一步阅读,您说您不想依赖外部密码文件,但这是唯一真正安全的方法。其他任何东西都会在进程表或其他地方留下痕迹。如果您真的愿意,您甚至可以将密码文件置于版本控制中。将其设置为 600(或 400),并且只有 mysql 或正在运行该密码文件的用户才能读取。

答案3

您有 4 个选项http://dev.mysql.com/doc/refman/5.1/en/password-security-user.html

  • 在命令行上使用-pyour_pass或选项--password=your_pass
  • 在命令行上使用-p--password选项,不指定密码值。在这种情况下,客户端程序以交互方式请求密码:
  • 将您的密码存储在选项文件中。
  • 将密码存储在MYSQL_PWD环境变量中

根据您的需要,这MYSQL_PWD可能是一种选择,但并不更安全。实际上,您应该生成一个交互式进程并--password以交互方式提交密码,但对于这个问题来说,这是一个相当复杂的解决方案。

答案4

如果您的 PHP 脚本已经打开了数据库连接,为什么不直接使用它mysqli_multi_query()来导入 .sql 文件呢?当然,前提是 .sql 文件的语法有效...

相关内容