【发布时间】:2016-07-19 14:07:48
【问题描述】:
我正在尝试创建一个 cron 将访问的 php 文件。该文件将创建它所连接的数据库的备份。为此,它使用 PHP 的 exec() 和 mysqldump
这一切都很好,但是,它只有在它正在编写的目录具有权限0777 时才有效。我用不同的权限进行了测试,似乎只有世界数字需要为 7。(或者至少我认为是读写)
问题是,我不希望服务器以外的任何人看到这个备份,因为它包含用户信息! (即使此信息已加密)
我曾尝试在目录上使用chmod,仅在写入文件时将其设为0777,但无法更改权限,这可能是另一个安全风险。
有没有办法将此文件写入具有0700 权限的目录?或者有没有其他我现在没有看到的方法......
源代码:
<?php
backup('notecms', 'root');
function backup($name, $user, $pass = NULL) {
$filename='/note_db_backup_'.date('G_a_m_d_y').'.sql';
if ($pass == NULL) {
$result=exec('mysqldump notecms --single-transaction --user='. $user .' -r '. $filename . ' 2>&1', $output, $return_var);
}
else {
$result=exec('mysqldump notecms --single-transaction --user='. $user .' -p='. $pass .' -r '. $filename . ' 2>&1', $output, $return_var);
}
if($return_var == 0){
//return 0;
if (!chmod($filename, 0600)) {
die('could not change backup permissions');
}
deleteold();
}
else {
print_r($output);
global $backup_output;
$backup_output = $output;
//return 1;
}
}
function deleteold() {
$filecount = count(scandir("../backup/")) - 2;
if ($filecount > 5) {
$files = glob( '../backup/*' );
array_multisort(
array_map( 'filemtime', $files ),
SORT_NUMERIC,
SORT_ASC,
$files
);
unlink($files[0]);
}
}
?>
【问题讨论】:
-
每个用户都有自己的 crontab,只要确保该目录的所有者是运行 cron 作业的那个。
-
考虑用 bash 重写这个脚本来移除 PHP 依赖。或者,如果您想将其保留在 PHP 中,请务必使用 php.net/manual/en/function.escapeshellarg.php 转义插值变量($user、$pass 和 $filename)
-
功能备份也在根目录上工作。您在 $filename 定义上有硬编码路径,尝试传递 $filename='note_db_backup_'.date('G_a_m_d_y').'.sql';没有斜线
-
@WouterH 因为这将留在 PHP 中,谢谢!即使这些价值观不应该是这样的,我也会为了安全起见!
-
@PerroVerd 你是对的。最初是这样的,所以这不是问题。感谢您指出这一点。
标签: php mysql mysqldump database-backups