【问题标题】:Using mysqldump on hosted servers without directory 777 permision在没有目录 777 权限的托管服务器上使用 mysqldump
【发布时间】: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


【解决方案1】:

没有理由将权限设置为0777。您需要执行脚本的用户对该目录具有读/写权限,因此请确保该用户拥有该目录并且您只需要0700

【讨论】:

  • 好的,我想我应该使用chown()。我将如何继续这样做。这个文件最终可能会在很多不同的服务器上,恐怕在很多情况下所有者必须不同。
  • 部署文件和安装 cron 作业的方式相同。理想情况下,您在每台服务器上创建一个备份用户,以备份用户身份执行此文件,然后写入备份用户的主目录。理想情况下,您应该有一个上传 php 文件、使用其主目录创建备份用户、安装 cron 作业等的 ansible 脚本。
  • 工作方式:此代码是 cms 的一部分。 cms 将安装此文件以及其他文件,并可能设置 cron 作业。我将如何设置用户并让他们运行这个文件,只有 php.ini 文件。我将无权访问服务器管理面板,并且希望完全无需用户交互。
  • 那么我认为没有解决方案可以通用且安全地执行此操作。如果您不控制要部署到的服务器,同时依赖execmysqldump 可用也是相当冒险的。
  • 那么这里好像是这样... 用纯php编写这个函数怎么样,使用普通查询来制作备份文件。这意味着我不需要execmysqldump。你觉得这行得通吗?
【解决方案2】:

您的脚本必须以目录所有者的身份运行,或者能够向该所有者发送 sudo 以运行脚本。由于您需要在许多服务器上完成,您应该与系统管理员联系以让他们进行设置。

他们可以将其设置为仅针对该任务工作,并且可能有一种方法将其推送到所有服务器..

【讨论】:

  • 如果文件在不同的服务器上使用,我将如何使用chown()。我不知道什么样的服务器,但这意味着所有者是不同的吗?
  • 为了可维护性和安全性,同一操作系统的大多数服务器的配置应该相同。如果你不知道什么样的服务器,我看不出你如何确保它工作,甚至测试它。
猜你喜欢
  • 2013-07-19
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 2018-09-07
  • 2012-07-17
  • 1970-01-01
  • 2014-07-19
  • 2013-03-20
相关资源
最近更新 更多