我们有一个PHP命令行脚本来版本化数据库。 只要开发者添加了新的数据库补丁,我们就运行这个脚本。
脚本使用MySQL命令行运行修补程序:
system('mysql --user=xxx --password=xxx < patch.sql');
但是,MySQL 5.6现在发出以下警告:
警告:在命令行界面上使用密码可能不安全
这显然是正确的,但可能或可能不会成为用户的问题。
请注意,我不想依靠外部密码文件。
在最近的GA版本的MySQL中,即版本 5.6 ,你可以通过mysql_config_editor命令来完成,如http://dev.mysql.com/doc/refman/5.6/en/mysql-config-editor.html
基本上,它的作用是:用主机别名encryption你的用户/密码凭证,然后使用主机别名,把这些信息放到主目录下的configuration文件中,然后当你需要的时候,而不是像:
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
您可以根据需要为不同的帐户和/或主机使用不同的loginpath。 如果你问我,这是个好主意。
作为一个说明,我相信,这个function不存在于5.6以下的任何版本。
使用--defaults-file
或--defaults-extra-file
选项。 您可以在其中指定用户标识和密码。 它的格式与/etc/my.cnf
相同。
进一步阅读,你说你不想依赖外部密码文件,但这是唯一真正安全的方法。 其他任何东西都会在进程表中留下痕迹。 你甚至可以把密码文件放在版本控制中,如果你真的想的话。 使它成为600(或400),只有mysql或它正在运行的用户可读。
您有4个选项,每个http://dev.mysql.com/doc/refman/5.1/en/password-security-user.html
-pyour_pass
或--password=your_pass
选项 -p
或--password
选项,没有指定密码值。 在这种情况下,客户端程序交互式地请求密码: MYSQL_PWD
环境variables中 为了您的需要, MYSQL_PWD
可能是一个选项,但它不是更安全。 真的,你应该用--password
生成一个交互过程,并交互地提交密码,但是这个问题的解决scheme相当复杂。
如果你的PHP脚本已经有了一个开放的数据库连接,为什么不使用mysqli_multi_query()
来导入.sql文件呢? 如果.sql文件的语法是有效的,当然…