仅允许特定用户从服务器下载文件

时间:2011-11-17 02:35:50

标签: php sql security csv

我正在根据用户数据创建文件(从数据库表中获取,写入csv文件,存储在服务器上,然后打印出用户(登录)下载的链接)。

如何确保只有用户才能下载该文件?例如,如果文件存储在http://mysite.com/username/file,我如何确保只有该用户在登录时才是唯一可以下载该文件的用户?使用php。

感谢您的帮助

6 个答案:

答案 0 :(得分:2)

PHP手册有一个用户提交的条目,可以满足您的需求:

function query_to_csv($db_conn, $query, $filename, $attachment = false, $headers = true) {

    if($attachment) {
        // send response headers to the browser
        header( 'Content-Type: text/csv' );
        header( 'Content-Disposition: attachment;filename='.$filename);
        $fp = fopen('php://output', 'w');
    } else {
        $fp = fopen($filename, 'w');
    }

    $result = mysql_query($query, $db_conn) or die( mysql_error( $db_conn ) );

    if($headers) {
        // output header row (if at least one row exists)
        $row = mysql_fetch_assoc($result);
        if($row) {
            fputcsv($fp, array_keys($row));
            // reset pointer back to beginning
            mysql_data_seek($result, 0);
        }
    }

    while($row = mysql_fetch_assoc($result)) {
        fputcsv($fp, $row);
    }

    fclose($fp);
}

// Using the function
$sql = "SELECT * FROM table";
// $db_conn should be a valid db handle

// output as an attachment
query_to_csv($db_conn, $sql, "test.csv", true);

// output to file system
query_to_csv($db_conn, $sql, "test.csv", false);

答案 1 :(得分:1)

我正要编辑你的问题并删除sql和csv标签,因为根据要求,它并不真正与这些主题有关。但是,我的回答是。

不是将文件保存到文件系统,而是生成csv文件以直接输出到响应。您的代码只会为用户生成正确的csv(或非用户的内容),从而解决问题。

这假设文件的生成是适度轻量级的,并且不会经常进行。

答案 2 :(得分:0)

如果用户未登录,或者用户不对,只需显示消息或重定向或任何您想要的内容,而不是提供对该文件的访问权限。您显示的url示例应该只是一个链接或重定向到真实文件的页面。您甚至可以生成文件名哈希值,以获得更好的安全性。

答案 3 :(得分:0)

不幸的是,你需要在一些代码中包装下载。您可以使用与此类似的技术:

if ($user->is_correct_user_with_access())
{
     header('Content-Type: application/octet-stream'); // this can be replaced with whatever file format you want;

     echo file_get_contents($local_path_to_file);
     die;
}

还要确保您生成的文件不在可公开访问的路径中(即,它应位于文档根目录下方)

答案 4 :(得分:0)

您可以创建一个名为download.php的文件,例如:

if($logged_in && $username == $_GET['download_username']) {

    header("Content-Type: application/force-download");
    header('Content-Disposition: attachment; filename=nameofdownload.zip');
    readfile('downloads/' . $_GET['download_username'] . '/file.zip');

}

然后在downloads文件夹中,您可以创建一个.htaccess文件,并输入以下内容:

Deny from all

答案 5 :(得分:0)

听起来像一个微不足道的问题......有很多方法,如果用户登录,那么只需检查他们请求的文件属于他们。

执行此操作的最佳方法可能是使用传递文件。例如,对/username/file的请求实际上是调用/download.php?id=username&dl=file,然后您可以在其中检查登录的用户是否等于id或尝试从中下载的文件的用户名,如果它们匹配则使用php标头位置将请求重定向到另一个位置,虽然可以通过查看标题来利用它;所以为了使它无缝,你将文件存储在web目录之外,并使用php读入文件并将其直接输出到浏览器。