使用PHP安全下载文件,未经许可拒绝用户

时间:2012-11-19 12:44:14

标签: php file download

我正在创建一个网站,您可以在其中购买虚拟点文件,然后下载它们。我不想让用户下载文件而不购买它,所以我必须隐藏它们。我把所有文件放在一个文件夹中,未经许可除了主机之外的任何人,问题是当有人购买文件并想下载它时。

我决定创建一个文件getter,它将检查用户的权限,然后打印出文件内容。到目前为止我的代码:

<?php
    require_once('content/requirements.php'); //mysql connections
    secure(1); //disconnect unlogged users

    if (!isset($_GET['id'])) //if no file id provided
        die();

    $fid=mysql_real_escape_string($_GET['id']); //file id

    $query="SELECT * FROM files WHERE user_id = "$_SESSION['user_id']." AND file_id = ".$id;

    $q=mysql_query($query);

    if (mysql_num_rows($q)!=1) //if no permission for file or multipe files returned
        die();

    $file=mysql_fetch_array($q); //file id
    $sub=mysql_fetch_array(mysql_query("SELECT * FROM sub WHERE id = ".$file['file_id'])); //payment id
?>

现在当我确定用户有权这样做时,phpScript应该编写文件内容并发送适当的标题让用户下载。

如何逐字节读取文件并打印它以及我应该在header()中写什么,以使文件可下载(因此您不必对其内容进行复制)。

也许这不是最好的方法,但这是我一段时间以来最好的想法。

Thanx寻求帮助。

2 个答案:

答案 0 :(得分:9)

来自readfile php doc

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}

答案 1 :(得分:5)