2012-02-13 14 views
5

Sono spesso confrontato con commenti negativi ogni volta che voglio avere un output di scrittura di script PHP su un file sul server.Come si consente a PHP di scrivere su un file senza compromettere la sicurezza del server

Uso le funzioni fopen(), fwrite() e fclose().

L'unico modo in cui so come farlo è impostare i permessi per il file di output su 0666 o farlo diventare "nessuno" (che è l'utente che PHP gira sotto sul nostro server web Apache).

Quindi, se "0666" o "di proprietà di nessuno" sono rischi per la sicurezza, come si consente a uno script PHP di scrivere in un file con successo e in modo sicuro?

Grazie per condividere le indicazioni su questo argomento.

+0

Spiegare come si sta "compromettendo la sicurezza del server" consentendo al proprio script di scrivere su un file. Anche scrivere su un DB è un rischio per la sicurezza? Assicurati che il tuo codice non abbia problemi di sicurezza. Finché le cose sono fatte bene, allora non ci sono problemi. – Flukey

+0

@Flukey ... qui sta lo scopo della mia domanda. Non vedo chiaramente il problema. Ma ogni volta che accedo di avere un file 0666 sul server o un file di proprietà dell'utente che PHP gira sotto, ricevo commenti di avvertenza che vanno sulla falsariga di ... "e ovviamente sai che stai aprendo il tuo server alla sicurezza rischi". Voglio semplicemente scrivere script efficaci senza compromettere la sicurezza del server. –

+1

Fintanto che il file in corso di scrittura è al di fuori della directory pubblica di Apache, quindi non vedo un problema. I loro commenti sono ignoranti. – Flukey

risposta

3

Se è necessario accedere ai file da PHP dopo che sono stati caricati, devono essere archiviati con autorizzazioni che consentono al server Web (apache in questo caso) di accedervi. Il rischio che la gente parli è che alcuni script sul tuo sito potrebbero essere ingannati nel servire il file. Si tratta di un rischio ipotetico, ma che si è verificato con molti sistemi di gestione dei contenuti. Per mitigare questo rischio:

  1. Rendere il nome e il percorso del file non facilmente ipotizzabili. Se un utente ha un percorso per getfile.php?file=1.txt, può facilmente dedurre che esiste anche uno 2.txt. Cripta il nome o fallo senza conseguenze.
  2. Effettuare qualsiasi script che serva su file affermare cose come l'utente connesso, l'autorizzazione alla risorsa e rimuovere qualsiasi cosa dal nome del file contenente un percorso per evitare riferimenti canaglia a /etc/passwd e simili.

Se hai solo bisogno di rilasciare il file e non servirlo o accedervi tramite PHP di nuovo, hai altre opzioni. Utilizzare i comandi chmod o chown per renderlo illeggibile all'utente apache. Se vuoi essere un paranoico in più, fai in modo che uno script di cron sposti il ​​file (e rinominalo) in una posizione sconosciuta all'interno del sorgente PHP. Almeno allora se il tuo server viene violato l'intruso non può entrare direttamente nella directory, ma stiamo arrivando al punto in cui la discussione vira verso la sicurezza del sistema operativo.

+0

Grazie a @DuaneGran. Leggerò la tua risposta e la digerirò più a fondo. Ma la mia prima reazione è cosa intendi con "Hash il nome"? E come lo fai e lo usi nella sceneggiatura? –

+0

@ Dr.DOT Mi sono sbagliato a suggerire un hash perché quello è un modo. Colpa mia. Come accade, questa domanda molto recente ha risposte sulle funzioni di criptaggio/decrittografia facile che funzionerebbero per il nome del file: http://stackoverflow.com/questions/9262109/php-simplest-two-way-encryption –

-1

Il rischio è che tale directory scrivibile risieda in un'area accessibile al mondo esterno. Quindi quelli con gli strumenti giusti e sanno come scrivere qualsiasi cosa vogliano a quella directory ... o al file. Possono quindi inserire malware o creare uno schema di phishing sul tuo sito.

Davvero possono fare ogni genere di cose per comprometterti. Ho visto questo sui miei server e non ho davvero trovato la soluzione giusta per questo.

Problemi correlati