我们有一个 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 文件的语法有效...