Come posso evitare uno script PHP incluso di modificare l'URL Location?
Domanda
Sono tra cui uno script PHP che cambia l'URL.
// index.php
ob_start();
include "script.php";
// This script redirects using header("Location:");
$out = ob_get_clean();
// I use the $out data for calculations
echo $out;
C'è un modo semplice per contrastare o annullare questo redirect indesiderati? Che ne dite di:
header("Location: index.php"); // redirect back to self
Ma questo causa un loop di reindirizzamento senza fine ... qualche idea?
O c'è un modo per togliere l'intestazione () chiama dal buffer $ out, evitando che mai raggiungere il cliente?
Soluzione
Solo per riferimenti futuri. Dal PHP 5.3 c'è una nuova funzione chiamata header_remove () che aiuta trattare con queste situazioni.
Altri suggerimenti
Si potrebbe provare a sovrascrivere il campo di intestazione con un valore non valido, come ad esempio:
header('Location: ', true);
Ma io non so come i clienti reagiscono su questo.
In realtà non è un buon modo per farlo. Due cose mi vengono in mente:
- Apri script.php come file di testo, striscia fuori qualsiasi intestazione () comandi e quindi eval () il risultato.
- Echo uno spazio prima di includere script.php e poi intrappolare l'avvertimento che PHP genera circa l'emissione di un colpo di testa () dopo che l'uscita è già iniziato. Avresti bisogno per riprendere lo spazio prima del buffer di uscita.
Che dire incluso il file prima come una variabile con file_get_contents()
, escludendo le intestazioni indesiderati e poi eseguendolo con codice PHP (non voglio menzionare la parola male utilizzato per analizzare una stringa PHP come codice PHP)?
Se non si dispone di PHP5.3 a vostra disposizione (probabilmente non lo fanno), di Gumbo risposta non funziona e non si desidera utilizzare eval, quindi l'unica altra opzione che posso vedere, è l'uso di flussi . Questa è però ancora un altro, più flessibile ma complessa, forma di eval. Streams, combinate con tokenizer , e sarete in grado di ottenere liberarsi di quella chiamata di funzione con un semplice:
require 'no-header://script.php';
Dal momento che hai il testo completo in una stringa prima di output, è possibile rimuovere le intestazioni semplice che desiderate con una ricerca e sostituzione (usando una regex per esempio).