如何限制下载访问使用PHP创建的CSV文件


How do I restrict download access to a CSV file created using PHP?

目标:

我需要通过PHP创建一个CSV文件,但将下载权限限制在负责创建文件的成员。

上下文:

网站成员可以选择将他们的个人资料数据输出到CSV文件。创建的CSV文件表示存在潜在的隐私问题。我担心,如果两个成员同时创建CSV文件,重叠可能会导致一个成员的数据泄露给另一个成员。

我尝试过的:

<?php
$list = array (
    array('1', '2', '3', '4'),
    array('a', 'b', 'c', 'd')
);
$fp = fopen('file.csv', 'w');
foreach ($list as $fields) {
    fputcsv($fp, $fields);
}
fclose($fp);
?>
<!--File is in root-->
<a href="/file.csv">Download file.csv</a>

我的问题:

  1. 如何限制创建CSV文件的成员的下载访问权限
  2. 创建CSV文件时,成员之间是否会发生重叠,因为它本质上是一个共享文件

到目前为止,我的想法是给每个CSV文件一个唯一的名称,而不是重写同一个文件。这将解决重叠问题,尽管这些文件在浏览器中定位时仍然可以访问。我可以将CSV文件分配到受限制的文件夹,但下载后销毁文件可能更理想。

有没有更好的方法来解决这一切?

最简单的方法是将数据输出到stdout,并在调用脚本时发送正确的标头。

例如,您有以下HTML链接:

<a href="download_csv.php">Download as CSV</a>

download_csv.php中,您只需执行:

$list = array (
    array('1', '2', '3', '4'),
    array('a', 'b', 'c', 'd')
);
// Send the proper headers
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename=results.csv');
// Open stdout instead of an actual file
$fp = fopen('php://output', 'w');
foreach ($list as $fields) {
    fputcsv($fp, $fields);
}
fclose($fp);

这将解决你的两个问题。