我希望有一个受到适当保护的PHP基于Web的工具来为一般数据库表运行状况运行mysqlcheck
,但我不希望密码在进程列表中可见。我想运行这样的东西:
$output = shell_exec('mysqlcheck -Ac -uroot -pxxxxx -hhostname');
// strip lines that's OK
echo '<pre>'.preg_replace('/^.+\\sOK$\\n?/m', '', $output).'</pre>';
不幸的是,对于shell_exec()
,我必须在命令行中包含密码,但我担心密码会显示在进程列表中(ps -A | grep mysqlcheck
)。
在我的测试机器上使用mariadb 5.5,mysqlcheck没有在进程列表中显示密码,但是我的生产机器没有运行mariadb并且运行不同的操作系统而且我想要安全且安全不要在生产方面进行这些测试。
所有版本的mysql是否也隐藏了进程列表中的密码?我的担忧是不是问题吗?
答案 0 :(得分:5)
是的,至少从MySQL 5.1开始,客户端会在命令行上隐藏密码。
我从2009年前MySQL社区经理Lenz Grimmer发现了这个博客,其中他链接到MySQL 5.1源代码中的相关代码。 http://www.lenzg.net/archives/256-Basic-MySQL-Security-Providing-passwords-on-the-command-line.html
您也可以不在命令行上传递密码,而是将用户/密码凭据存储在PHP有权读取的文件中,然后执行客户端:
mysqlcheck --defaults-extra-file=/etc/php.d/mysql-client.cnf
文件名是一个例子;您可以指定所需的任何路径。关键是大多数MySQL客户端工具都接受--defaults-extra-file
选项。有关详细信息,请参阅http://dev.mysql.com/doc/refman/5.6/en/option-file-options.html。
答案 1 :(得分:1)
这是一个真正令人担忧的问题,您的操作系统将会显示它,而不是在默认视图中。
您可以使用proc_open,这样您就可以读取和写入该文件打开的流。
mysqlcheck -Ac -uroot -p -hhostname
将提示输入您可以使用proc_open
中的管道写入的密码