2016-04-07 14 views
5

Ero sempre sicuro che le funzioni PHP file_get_contents e readfile eseguissero qualsiasi codice PHP in qualsiasi file, indipendentemente dal tipo di file, che gli viene fornito. Ho provato questo su più configurazioni, e ha sempre funzionato.Do file_get_contents e readfile eseguono il codice PHP?

Ho ricevuto una domanda su questo here e l'utente sembra pensare che questo non sia il caso.

Ho esaminato la documentazione PHP per le funzioni, e non menzionano l'esecuzione del codice (che è qualcosa che mi aspetterei se questo è normalmente il caso, in quanto ha gravi implicazioni per la sicurezza).

Ho anche cercato per esso, e ho trovato molte affermazioni che le funzioni non eseguono il codice PHP. Ad esempio:

readfile non esegue il codice sul server in modo che non ci siano problemi. source

Ricerca di "file_get_contents php l'esecuzione di codice" restituisce anche diverse questioni che cercano di eseguire il codice PHP recuperate, che sembra strano se sarebbe davvero normalmente eseguire qualsiasi dato codice PHP.

Ho trovato anche one question che chiede informazioni sull'esecuzione del codice PHP, quindi l'esecuzione sembra avvenire anche ad altri.

Quindi le mie domande sono:

  • fanno le funzioni file_get_contents e readfile eseguire codice PHP in file recuperati?
  • dipende da alcune impostazioni di php.ini? Se sì, quali impostazioni?
  • dipende dalla versione di PHP e, in caso affermativo, quali versioni sono interessate?
  • se non è normalmente il caso, quali possono essere le ragioni per cui eseguono il codice PHP nelle mie configurazioni?
+0

Sembra più una questione di programmazione che di sicurezza. Hai controllato il manuale di php.net? Sembra che non ci sia alcuna esecuzione per me ... –

+0

Mi piacerebbe molto vedere un esempio di codice in cui "funziona" ... – deceze

risposta

7

file_get_contents e readfilenon eseguire codice. Tutto ciò che fanno è restituire il contenuto non elaborato del file. Quello potrebbe essere testo, codice PHP, binario (ad es.file di immagine) o qualsiasi altra cosa. Nessuna interpretazione dei contenuti dei file sta accadendo affatto.

L'unica situazione in cui si può apparire come se l'esecuzione avviene è:

  1. <?php ?> tag saranno probabilmente nascosti dal browser perché si sta cercando di interpretarli come tag HTML, quindi questo può portare l'impressione che PHP sia scomparso e quindi potrebbe essere stato eseguito.
  2. Stai leggendo da una fonte che esegue il codice, ad es. durante la lettura da http://example.com/foo.php. In questo caso, le funzioni hanno lo stesso effetto di visitare quegli URL in un browser Web: il server Web di servizio sta eseguendo il codice PHP e restituendo il risultato, ma lo file_get_contents ottiene semplicemente quel risultato e lo restituisce.
6

Tali funzioni sono descritte nella Estensioni « di riferimento alle funzioni/File System correlati/Filesystem » sezione del manuale, mentre la funzione di eseguire codice sono descritte in « di riferimento alle funzioni/processo Estensioni di controllo ».

Sono abbastanza sicuro che l'equivoco derivi da una confusione in qualche modo diffusa tra file system e rete e ciò è aggravato dalla funzionalità dei flussi PHP che fornisce i wrapper di protocollo che consentono di utilizzare le stesse funzioni per aprire in modo trasparente qualsiasi tipo di risorse: file locali, reti di risorse, archivi compressi, ecc vedo infiniti post qui dove qualcuno fa qualcosa di simile:

file_get_contents('http://example.com/inc/database.inc.php'); 

... e si chiede perché non può vedere questa connessione al database. E la risposta è chiara: non stai caricando un file, stai recuperando un URL. Di conseguenza, il codice all'interno di database.inc.php viene eseguito in modo efficace ... anche se indirettamente.

Problemi correlati