基本的CHMOD限制

时间:2012-03-28 22:51:21

标签: php .htaccess file-upload chmod file-sharing

我的网站上有一个上传文件夹。 我想要做的是限制用户访问,就像我不希望他们去www.mysite.com/uploads/看到那里的文件,它应该显示禁止,但他们应该能够通过我的网站下载,例如www.mysite.com/downloads.php?id=1

如果那不可能,我怎么能在/ uploads上显示目录索引

文件共享网站如何做到这一点?

htaccess with

deny from all

也阻止php访问该文件
请告诉我一个解决方案,如果你知道,我几天前用谷歌搜索并询问了这个问题,这对我来说非常困惑。

5 个答案:

答案 0 :(得分:2)

如果要隐藏用户的文件URL,最好将upload folder移到webroot目录之上。所以没人能从浏览器访问。如何制作download.php

<?php

 /*
    Step 1. Authorization check
    Step 2. get name or id of file that will download $_GET
    Step 3. check if its valid (security check)
    Step 4. check if that file exist in your upload directory
    Step 5. set header using header() function put content-type, attachment etc
    Step 6. readfile and output it
 */
 ?>

答案 1 :(得分:0)

在.htaccess文件中添加此行

Options -Indexes

答案 2 :(得分:0)

将index.htm文件放在uploads文件夹中,或将Options -Indexes放在.htaccess文件中

答案 3 :(得分:0)

为什么不只为可下载的东西(mkdir publicuploads)创建一个位置,但chmod 700你的上传文件夹? 然后他们可以下载你允许他们下载的内容......

答案 4 :(得分:0)

使用带有deny from all的.htaccess文件会阻止人们访问该文件夹,它不会阻止php访问它,但是您可以将文件放在比htdocs/www/public_html文件夹低一个目录并使用php抓住并提供thos文件。

通过传递参数例如:?id=1,您将使用1访问$_GET['id'],您需要检查文件是否存在,添加一些http标头以强制下载。

下面是一个可以解决的简单例子:

<?php 
//your below webroot downloads folder
$path="/var/www/somehost.com/downloads/";

//An array created from globing the download directory or from a database source
$files=array('somefile.gif',
             'someotherFile.png');


//In my example the id is the key to the file pathe array so 0 would be somefile.gif and 1 would be the next.
if(isset($_GET['id'])){
    //Is it numeric?
    if(is_numeric($_GET['id']) && isset($files[$_GET['id']])){
        //Download the file, the download function will return error on fail, eg: not found or directory
        $status = download($path.$files[$_GET['id']]);
        //Spit out the error
        if(isset($status['error'])){
            die($status['error']);
        }
    }
}

function download($file,$chunk=1024){
    if (file_exists($file)) {
        if(is_dir($file)){return array('error'=>'Not allowed!');}
        //Set content headers to force download.
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="'.str_ireplace(' ','_',basename($file)).'"');
        header('Content-Transfer-Encoding: binary');
        header('Connection: Keep-Alive');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        //If download is larger the 2GB, alls not lost
        header('Content-Length: '.sprintf("%u", filesize($file)));
        //Clean the buffer
        ob_clean();
        //Open a handle to the file
        $handle = fopen($file, "rb");
        $chunksize=(sprintf("%u", filesize($file))/$chunk);

        set_time_limit(0);
        //Loop through the file 
        while (!feof($handle)) {
                    //Echo a piece of the file out
            echo fgets($handle, $chunksize);
            flush();
        }
        fclose($handle);
        die;
    }else{return array('error'=>'Not found!');}
    return;
}
?>

您还需要检查文件的用户权限,但这是另一个问题。