it-swarm-eu.dev

Oprávnění pro doručování dočasných souborů

Mám systém (webová aplikace), který stahuje přílohy souborů ze systému třetích stran přes SOAP. To je zase náš systém vytvořený jako soubory v adresáři.

Když uživatel systému (ověřený pomocí ldap) požádá mou aplikaci o načtení jedné z těchto příloh:

1. I request it via soap
2. Process the response to build the file on our system
3. Redirect user to the location so they can download the file.  

Za prvé, je to dobrý přístup?

Existuje lepší způsob, jak obsluhovat soubory, které nebudou po stažení přílohy příliš na serveru (úloha cron vyčistí adresář tak často)?

Za druhé, existuje způsob, jak mohu obsluhovat soubory prostřednictvím Apache, aniž by je ukládal do webového kořenového adresáře?

Zatřetí, jak mohu vynucovat oprávnění k těmto souborům, aby nejen každý uživatel mohl stáhnout pouze jakoukoli přílohu?

Naše nastavení:

linux
Apache
php - soap libraries for communication 
seperate LDAP for authentication
3rd party soap server (where attachments come from) 

ÚPRAVA: Kód sloužící příloze v případě, že je někdo zvědavý.

    <?php 

ini_set('display_errors',1);
error_reporting(E_ALL|E_STRICT);

//require global definitions 
require_once("includes/globals.php"); 
//validate the user before continuing 
isValidUser(); 
$subTitle = "Attachment";   
$attachmentPath = "/var/www/html/DEVELOPMENT/serviceNow/selfService/uploads/";
if(isset($_GET['id']) and !empty($_GET['id'])){
    //first lookup attachment meta information 
    $a = new Attachment(); 
    $attachment = $a->get($_GET['id']); 
    //filename will be original file name with user name.n prepended 
    $fileName = $attachmentPath.$_SESSION['nameN'].'-'.$attachment->file_name; 
    //instantiate new attachmentDownload and query for attachment chunks 
    $a = new AttachmentDownload(); 
    $chunks= $a->getRecords(array('sys_attachment'=>$_GET['id'], '__order_by'=>'position')); 


    $fh = fopen($fileName.'.gz','w');                                                      
    // read and base64 encode file contents 
    foreach($chunks as $chunk){
            fwrite($fh, base64_decode($chunk->data));   
    }
    fclose($fh);

    //open up filename for writing 
    $fh = fopen($fileName,'w');     
    //open up filename.gz for extraction                                
    $zd = gzopen($fileName.'.gz', "r");
    //iterate over file and write contents 
    while (!feof($zd)) {
            fwrite($fh, gzread($zd, 60*57));    
    }
    fclose($fh); 
    gzclose($zd);
    unlink($fileName.'.gz'); 
    $info = pathinfo($fileName); 

    header('Content-Description: File Transfer');
    header('Content-Type: '.Mimetypes::get($info['extension']));
    header('Content-Disposition: attachment; filename=' . basename($fileName));
    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($fileName));
    ob_clean();
    flush();
    readfile($fileName);
    exit();
}else{
    header("location: ".$links['status']."?".urlencode("item=incident&action=view&status=-1&place=".$links['home']));   
}


?>
8
Chris

Za prvé, je to dobrý přístup?

Zní mi dobře. Jen se ujistěte, že jste uživatele ověřili, než projdete vše.

Existuje lepší způsob, jak obsluhovat soubory, které nebudou po stažení přílohy příliš na serveru (úloha cron vyčistí adresář tak často)?

Za druhé, existuje způsob, jak mohu obsluhovat soubory prostřednictvím Apache, aniž by je ukládal do webového kořenového adresáře?

Umístěte soubory mimo webroot. Potom pomocí PHP předejte soubor skriptem. Tímto způsobem nikdo nemůže odkazovat na soubor přímo a obejít vaše ovládací prvky. (Přirozeně se ujistěte, že skript, který to provede až po ověření, že uživatel má oprávnění tento soubor načíst).

Ukázka PHP:

<?php
    if (!isset($_SESSION['authenticated']))
    {
        exit;
    }
    $file = '/path/to/file/outside/www/secret.pdf';

    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;
?>

Zatřetí, jak mohu vynucovat oprávnění k těmto souborům, aby nejen každý uživatel mohl stáhnout pouze jakoukoli přílohu?

Zajistěte, aby se uživatelé přihlašovali a získávali soubory. Poté můžete nastavit proměnnou relace, která je identifikuje jako povolená ke stažení. Ujistěte se, že je skripty ověřují na každé stránce tohoto procesu.

2
John Conde