保护托管链接的目录

时间:2013-12-03 12:30:25

标签: php apache2

要登录该站点,将loginForm提交(POST)到login.php脚本。

查询Mysql,如果用户名/ md5 pw匹配,则设置一些$ _SESSION变量。

使用标题(“位置:securedLinks.php”)将用户重定向到安全页面。

在securedLinks.php上,我使用if(ISSET($ _ SESSION)){}检查$ _SESSION变量。

这是有效的,如果用户通过身份验证,那么他们可以单击链接来访问文件。这些链接位于securedLinks.php上,如下所示:http://mysite/files/link1.pdf

如果您从securedLinks.php复制链接然后打开一个新浏览器,您可以直接导航到该链接,无需通过securedLinks.php。

保护mysite / files目录的方法是什么?这是在Web服务器层上完成的,apache2使用指令吗?

由于

修改 - 解决方案

apache2 virtualServer config:

<Directory "/something/path/securedDirectory">
Options -Indexes
Order Deny,Allow
Deny from all
</Directory>

securedLinks.php返回文件列表

$fileList = scandir($securedDirectory);

jQuery遍历$ fileList,添加了到securedLinks.php的链接

$.each(linkObj, function(k,v){
    var a = "<a href='reportLoader.php?fileName=" + v + "'>" + v + "</a><br>";
    $("#reportLinks").append(a);
});

jQuery也会停止默认点击并删除href,然后设置下载

$(document).on("click", "#reportLinks a", function(e){
    e.preventDefault();
    var params = $(this).attr("href");
    getPdf(params);
});

function getPdf(urlParams){
    if (urlParams.length > 0){
        window.location.href = urlParams;
    }
}

最后,这是reportLoader.php如何流式传输文件

session_start();
if (isset($_SESSION['myVar'])) {
    $fileName = $_REQUEST['fileName'];
    $fullPath = $_SERVER['DOCUMENT_ROOT']."/securedDirectory/".$fileName;
    if ($fd = fopen ($fullPath, "r")) {
        $fsize = filesize($fullPath);
        $path_parts = pathinfo($fullPath);
        $ext = strtolower($path_parts["extension"]);
        switch ($ext) {
            case "pdf":
                header("Content-type: application/pdf"); 
                header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); 
            break;
            case "doc":
                header("Content-type: application/msword");
                header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); 
            break;
            case "docx":
                header("Content-type: application/vnd.openxmlformats-officedocument.wordprocessingml.document");
                header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); 
            break;
        }
        header("Content-length: $fsize");
        header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); //this is incompatible with IE8
        header("Content-Transfer-Encoding: Binary");
        readfile("$fullPath");
        fclose ($fd);
    }
}

1 个答案:

答案 0 :(得分:0)

通常,如果要将目录设为私有,则可以使用apache使用.htaccess文件限制目录,或者将目录上的权限设置为仅apache。这样就无法获得外部访问,然后当您需要这些文件时,apache可以在一个对用户安全的特定页面上为您提供服务。所以在脚本securedLinks.php上,apache可以访问这些文件,因此该目录可以为用户提供服务以供查看。