如何在codeigniter中限制对文件夹中文件的访问

时间:2012-09-03 11:34:38

标签: security .htaccess codeigniter robot

您好我使用codeigniter开发我的网站但是当我在谷歌搜索我的网站时,谷歌会显示特定文件夹中文件(pdf)的链接,用户可以直接查看这些文件(pdf)而无需登录。我想限制谷歌直接显示这些文件的链接。 例如:www.mywebsite / myfolder / myfile

请指导我如何实现这一目标。谢谢。

3 个答案:

答案 0 :(得分:5)

对上一个answer 进行了一些修改:

将.htaccess放在包含内容的文件夹中

order deny, allow
deny from all

这将拒绝对该特定文件夹的所有访问。

要访问文件,请在控制器中使用body -

编写一个函数
public function index($file_name){
    if($this->login())  // login check
        if (preg_match('^[A-Za-z0-9]{2,32}+[.]{1}[A-Za-z]{3,4}$^', $file_name)) // validation
            {
            $file = 'my_path/'.$file_name;
            if (file_exists($file)) // check the file is existing 
                {
                header('Content-Type: '.get_mime_by_extension($file));
                readfile($file);
                }
            else show_404()
            }
    else    show_404();
}

然后你必须在config文件夹中的routes.php文件中添加一些行,就像这样

$route['my_files/(:any)'] = "my_controller/index/$1";

这会将所有请求重定向到myfiles / bla_bla_bla到my_controller / index / bla_bla_bla

认为这可能有所帮助:)

答案 1 :(得分:0)

基本上你需要托管public_html文件夹之外的文件 - 而是通过php readfile()将它们提供给用户。

这样的事情会起作用

function user_files($file_name = "")
{
    // Check if user is logged in
    if($this->user->logged_in())
        {   
            // Now check the filename is only made up of letters and numbers
            // this helps prevent against file transversal attacks
            if (preg_match('^[A-Za-z0-9]{2,32}+[.]{1}[A-Za-z]{3,4}$^', $file_name)))
            {
                // Rewrite the request to the path on my server 
                $file = '../my_folder/'.$file_name;

                // Now check if file exists
                if (file_exists($file))
                {
                   // Serve the file
                   header('Content-Type: '.get_mime_by_extension($file));
                   readfile($file);
               }
            }
        }
    }
}

注意:你需要注意目录横向 - 所以你应该进行一些检查,文件名只由字母组成

答案 2 :(得分:0)

只需在readfile($file)之前添加以下代码。这将有助于浏览器读取图像和视频文件。

ob_clean();
flush();

完整示例

if($this->user->logged_in())
{
    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, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: '.filesize($file));
        ob_clean();
        flush();
        readfile($file);
        exit;
    }
}