защитите директория, която хоства връзки

за да влезете в сайта, се изпраща loginForm (POST) към скрипта login.php.

Mysql се запитва и ако потребителското име/md5 pw съвпадат, тогава се задават няколко променливи $_SESSION.

Потребителят се пренасочва към защитена страница с помощта на header('Location: securedLinks.php').

На securedLinks.php проверявам за променливите $_SESSION, използвайки if (ISSET($_SESSION)){}.

Това работи, ако потребителят е удостоверен, тогава той може да кликне върху връзките за достъп до файлове. Връзките са на securedLinks.php, така: http://mysite/files/link1.pdf

Ако копирате връзката от securedLinks.php и след това отворите нов браузър, можете да навигирате директно до връзката, без да се налага да преминавате през securedLinks.php.

Какъв е методът за защита на директорията mysite/files? Това направено ли е на ниво уеб сървър, apache2 с помощта на директиви?

Благодаря

Редактиране - Решение

конфигурация на apache2 virtualServer:

<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='/bgreportLoader.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);
    }
}

person dan    schedule 03.12.2013    source източник


Отговори (1)


Обикновено, ако искате да направите директория частна, можете да използвате apache, за да ограничите директорията с .htaccess файл или да зададете разрешенията за директорията само на apache. По този начин не може да бъде получен външен достъп и след това, когато имате нужда от файловете, apache може да ги сървърира вместо вас на конкретна страница, която е защитена за потребителя. Така че на скрипта securedLinks.php apache ще има достъп до тези файлове и директорията, следователно ще може да ги сервира на потребителя за преглед.

person AgnosticDev    schedule 03.12.2013