Domanda

Sto usando un web GoDaddy piano di hosting su una piattaforma Windows. Questo non era la mia scelta - ha a che fare con una parte diversa del sito reale utilizzando ASP.NET (anche non la mia scelta).

Ho un database SQL con un gruppo di voci con alcune informazioni sui clienti non sensibili. La chiave primaria su questo è un numero intero AutoIncrement, e ho una serie di file PDF che corrispondono con ognuno di quei numeri interi (ad esempio 555.pdf, 7891.pdf, ecc).

Il mio obiettivo è quello di limitare l'accesso diretto a questi file, voglio che gli utenti devono passare attraverso un processo di ricerca e di login (PHP) prima. Originariamente avevo pianificato di mettere i file sopra la cartella public_html, ma GoDaddy rifiuta di darmi l'accesso root senza un server dedicato ($ 20 al mese da loro).

La prossima cosa che ho guardato in era HTACCESS. Stavo per limitare l'accesso ai file agli script PHP solo consentendo solo l'accesso al l'indirizzo IP del server (o localhost / 127.0.0.1). Purtroppo questo non funziona perché GoDaddy non viene eseguito Apache sui propri server di Windows.

ho potuto mettere i file in BLOB nel database, ma che ottiene davvero disordinato quando ho bisogno di lavorare con loro in modo rapido (più ho avuto qualche problema con questo approccio).

Qualche suggerimento per limitare l'accesso ai file solo per uno script PHP (readfile ())?

È stato utile?

Soluzione

Dal momento che non è possibile mettere i file ovunque, ma nella directory public_html, dovrete andare per l'odiato temuto / "security by obscurity" metodo

  1. Crea una sottodirectory di nome casuale per memorizzare i file in: public_html / RANDOMGARBAGE

  2. Assicurarsi che la directory non è consultabile. Disabilita esplorazione directory (se è possibile), e mettere un documento predefinito (index.html?) In là pure, quindi, anche se la navigazione è attiva, non sarà possibile ottenere l'elenco di directory.

  3. Non conservare il file con nomi da indovinare. Invece di memorizzare con l'ID del database, memorizzarli con un + nome hash salata invece: $crypted_filename = sha1($real_filename . 'some hard-to-guess salt text'); (naturalmente, rendere questa più complessa se è necessario). Conservare il nome del file originale nel database. Così si finisce con qualcosa come:

    public_html/RANDOMGARBAGE/5bf1fd927dfb8679496a2e6cf00cbe50c1c87145 public_html/RANDOMGARBAGE/7ec1f0eb9119d48eb6a3176ca47380c6496304c8

  4. Servire il backup dei file tramite uno script PHP - mai un collegamento al nome del file hash direttamente

    Scarica

che poi fa:

<?php

    $fileID = (int)$_GET['fileID'];

    $crypted_file = sha1($fileID . 'some hard-to-guess salt text');

    $full_path = 'public_html/RANDOMGARBAGE/' . $crypted_file;
    if (is_readable($full_path)) {
         if(user_is_allowed_to_see_this_file()) {
             /// send file to user with readfile()
             header("Content-disposition: attachment; filename=$ORIGINAL_FILENAME");
             readfile($full_path);
         } else {
             die("Permission denied");
         }
    } else {
        /// handle problems here
        die("Uh-oh. Can't find/read file");
    }

In questo modo l'utente non potrà mai vedere che cosa il vostro "s00per seekrit" nome del file è, si vedrà solo la loro ...php?fileID=37 del browser di successo e iniziare un download di secret file.pdf

In cima a questo, si può di tanto in tanto rinominare la speciale sotto-directory a qualcosa d'altro su base regolare, così come modificare il testo del sale (che poi richiede di aggiornare tutti i nomi dei file hash con i nuovi valori SHA1).

Altri suggerimenti

Si può semplicemente nasconderli. E 'la sicurezza-through-obscurity, ma suona come la scelta migliore se non si può o tenerli fuori della web root, o trovare un modo per dire al server di non servire direttamente.

Così li bastone in una directory a caso il nome in:

asd8b8asd8327bh/123.pdf
asd8b8asd8327bh/124.pdf
asd8b8asd8327bh/125.pdf
...

Poi scrivere voi stessi un piccolo script PHP che invierà intestazioni appropriate, e passare il contenuto del file attraverso.

Ad esempio:

<?PHP
//pdf.php
$id = $_GET['id'];

//make sure nobody is doing anything sneaky. is_numeric() might do the trick if the IDs are always integers.
if (!some_validation_passes($id)){
  die();
}
<?php

header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="'.$id.'.pdf"');
readfile('asd8b8asd8327bh'.$id.'pdf');

Ora, quanto sopra è davvero meglio che solo servire i file direttamente (ancora), dal momento che la gente può ancora incrementare il parametro ID nella stringa di query.

Ma si dovrebbe essere in grado di capire come gestire l'autorizzazione abbastanza facilmente.

A causa PHP utilizza le autorizzazioni dell'utente web server, non v'è alcun modo per limitare l'accesso ai file senza né:

  • Mettendoli al di fuori del docroot
  • Modifica della configurazione del server Web per l'accesso a questi file Disallow
  • Modifica del file in modo che sarà interpretato dal server Web, nascondendo così il suo contenuto

mettendoli in un database come conta di fuori del docroot. Per la terza opzione, si potrebbe rendere i file PDF PHP, ma onestamente, che sarebbe piuttosto contorto.

vi consiglio di contattare GoDaddy e vedere se hanno qualche modo per configurare per-directory i permessi dei file.

Fare un inaccessibile cartella Web tramite chmod. PHP sarà ancora in grado di includere / richiedere tutto ciò che è sul server, ma gli utenti non saranno in grado di accedere ai file mai.

Esempio: Questo è impostato su 770, IE utente e di gruppo possono lettura / scrittura / esecuzione, altro può fare nulla.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top