2009-06-29 6 views
37

In PHP, c'è un modo per cancellare/rimuovere tutti gli elementi precedentemente echeggiati o stampati?Come cancellare elementi precedentemente echeggiati in PHP

Ad esempio:

<?php 

echo 'a'; 
print 'b'; 

// some statement that removes all printed/echoed items 

echo 'c'; 

// the final output should be equal to 'c', not 'abc' 

?> 

mio script utilizza la funzione di includere. I file inclusi non dovrebbero far eco a nulla. Nel caso in cui qualcuno (ex = hacker) ci provasse, ho bisogno di un modo per rimuoverlo.

+5

Se lo fai come "misura di sicurezza" probabilmente stai sbagliando. Dovresti considerare un approccio diverso al problema. Forse creare un'altra domanda affermando qual è il tuo problema? –

+0

Sto usando oci_execute e se la query non riesce, verrà visualizzato il messaggio di avviso . Ma sto gestendo l'errore separatamente e non voglio il messaggio di Oracle. Quindi questa domanda è applicabile anche in questo scenario – Adarsha

risposta

80
<?php 

ob_start(); 
echo 'a'; 
print 'b'; 

// some statement that removes all printed/echoed items 
ob_end_clean(); 

echo 'c'; 

// the final output is equal to 'c', not 'abc' 

?> 
funzioni di buffering

Output buffering functions

L'uscita è anche utile per aggiustamenti per costringere funzioni che stampano soltanto restituire stringhe, cioè.

+0

Esistono impostazioni apache per abilitare/disabilitare il buffering dell'output per più pagine? – Pacerier

+0

Puoi anche usare ob_end_flush() per stampare le istruzioni che seguono ob_start(), invece di scartarle. Vedi http://us3.php.net/ob_start –

+0

@ Matthew: aiutato molto! – VKGS

1

Idealmente, non si dovrebbe produrre nulla che in definitiva non si desidera stampare. Mantieni la tua logica separata dalla presentazione per meno frustrazione.

Detto questo, è possibile consultare le opzioni Output Buffering all'interno di PHP.

4

mentre @monoxide ha ragione, è meglio trovare modi più intuitivi di fare lo stesso. ad esempio:

<?php 
$val_to_print = $a; 
if($need_to_change==true) 
    $val_to_print = $b; 
// when you are sure you won't have to change again... 
echo $val_to_print; 
?> 

Cheers,

JRH

+1

È preoccupato per qualcuno che cambia i file su di lui che non controlla, quindi mentre hai ragione, non stai affrontando ciò di cui è preoccupato. –

+0

Inoltre, a volte la gente trascura gli EOL alla fine dei file include, causando un potenziale caos se è necessario inviare un'intestazione() più tardi ... –

+1

@monoxide A rischio di andare completamente fuori argomento, è possibile omettere l'ultima chiusura di PHP tag alla fine di un file che è un buon modo per eliminare completamente il problema. – Josh

0

Se si tratta di output di debug e lo stato programma di informazione siete preoccupati forse trigger_error può essere più vicino a ciò che è necessario, come ad esempio:

trigger_error ("Attempting to load report #{$report_id}.", E_USER_NOTICE); 

Quando lo script è in produzione, non mostra alcun errore in quanto generalmente sono disabilitati o registrati. È anche meglio fare errori fatali in questo modo con E_USER_ERROR piuttosto che usare die().

ob_start(); 
require ($filename); 
$html = ob_get_clean(); 

Quanto sopra includerà anche un file e fornirà il suo contenuto sotto forma di stringa.

Avvertenza: l'ammaraggio del buffer elimina anche eventuali messaggi di errore generati, rendendo il debug (potenzialmente) un incubo.

+0

Oppure, potenzialmente molto meglio se usi il $ html che hai ottenuto da get_clean() e lo metti nel corpo della tua pagina invece di rovinare le intestazioni e il posizionamento della maggior parte della tua pagina. –

-1

Se un hacker consente di accedere al proprio file PHP, sarà anche in grado di rimuovere l'istruzione cancellando il buffer di output.

Se stai facendo questo perché stai permettendo agli utenti di caricare script PHP, lascia che ti dica che questa è una pessima idea.

In entrambi i casi, fare ciò che si sta chiedendo aggiunge 0 sicurezza.

+0

Ho una funzione Ajax che consegna il nome/l'ubicazione del file di un file da includere nel mio documento php. Sto usando la funzione parse_url per disabilitare qualsiasi valore che è un percorso assoluto (prima che il file sia incluso). Il file incluso dovrebbe contenere solo qualsiasi array. Ho spostato l'array in ob_start e ob_end_clean per rimuovere qualsiasi contenuto eco. Vedi qualche potenziale problema di sicurezza? – edt

+0

Davvero molto. Significa che il tuo attaccante può eseguire qualsiasi dato file php sul tuo sistema. È meglio avere un file php per array e richiamare direttamente quel file. –

+0

Grazie per l'input. Affinché il programma funzioni, l'utente deve essere in grado di aggiungere i propri valori di array. Oltre a quanto sopra, ho anche richiesto che il file incluso contenga una stringa secondaria. Ad esempio, la stringa deve contenere "bar". "foo.php" non può essere incluso. "foo_bar.php" può essere incluso. Quindi, finché non ci sono altri file nel sistema che contengono "pippo", il programma dovrebbe essere sicuro. È giusto? Grazie ancora per il vostro aiuto. Molto apprezzato. – edt