2009-07-20 4 views
9

Sto scrivendo un set di script PHP che verranno eseguiti in alcune configurazioni diverse, alcuni dei quali condividono l'hosting con citazioni magiche su (l'horror). Senza la capacità di controllare la configurazione di PHP o Apache, posso fare qualcosa nei miei script per disabilitare le virgolette PHP in fase di runtime?Come posso disabilitare le virgolette PHP in fase di runtime?

Sarebbe meglio se il codice non presupponesse che le virgolette magiche fossero accese, in modo che io possa usare gli stessi script su host diversi che potrebbero o non potrebbero avere virgolette magiche.

risposta

15

Solo magic_quoted_runtime può essere disabilitato in fase di esecuzione. Ma magic_quotes_gpc non può essere disabilitato in fase di esecuzione (PHP_INI_ALL modificabile fino a PHP 4.2.3, da allora PHP_INI_PERDIR); è possibile solo rimuoverli:

if (get_magic_quotes_gpc()) { 
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); 
    while (list($key, $val) = each($process)) { 
     foreach ($val as $k => $v) { 
      unset($process[$key][$k]); 
      if (is_array($v)) { 
       $process[$key][stripslashes($k)] = $v; 
       $process[] = &$process[$key][stripslashes($k)]; 
      } else { 
       $process[$key][stripslashes($k)] = stripslashes($v); 
      } 
     } 
    } 
    unset($process); 
} 

Per ulteriori informazioni, vedere Disabling Magic Quotes.

+0

Questo sembra fantastico, grazie! –

+2

Penso davvero che questo codice dovrebbe anche 'ini_set ('magic_quotes_gpc', false);' per evitare che un'altra libreria fosse anche preoccupata di rimuovere i valori di input dalla loro rimozione. – gnarf

+1

@gnarf: Sarebbe dolce ma sfortunatamente non funziona in questo modo, se provi 'ini_set ('magic_quotes_gpc', 0)' otterrai 'false' ogni volta poiché questo è possibile solo in' PHP_INI_PERDIR'. –

0

Esso non può essere fatto a tempo di esecuzione :(

5

citazioni magiche non possono essere disabilitati in fase di esecuzione, ma è possibile utilizzare un file .htaccess nella directory per disattivarlo.

php_flag magic_quotes_gpc off 

L'unico vero vantaggio è possibile inserirla una volta in una directory e funziona per l'intera directory e sottodirectory.E 'davvero bello se è necessario per un'applicazione che non hai scritto e devi farlo funzionare senza virgolette

+0

Errore interno del server. Sembra che l'host non stia consentendo questa direttiva. :( –

+1

Sì, questo richiede che il server sia configurato per consentire la sovrascrittura di .htaccess. Mi spiace sentirlo non ha funzionato per te – MacAnthony

2

Ho un piccolo script per questo simile a Gum bo di (ma ovviamente mi piace la mia migliore :):

if(function_exists('get_magic_quotes_runtime') && get_magic_quotes_runtime()) 
    set_magic_quotes_runtime(false); 

if(get_magic_quotes_gpc()) { 
    array_stripslashes($_POST); 
    array_stripslashes($_GET); 
    array_stripslashes($_COOKIES); 
} 

function array_stripslashes(&$array) { 
    if(is_array($array)) 
     while(list($key) = each($array)) 
      if(is_array($array[$key])) 
       array_stripslashes($array[$key]); 
      else 
       $array[$key] = stripslashes($array[$key]); 
} 
+1

Molto utile come soluzione temporanea prima dell'aggiornamento 5.3 (vith default config di questa direttiva). non richiede altre modifiche al codice.) Grazie, – Fanda

+0

... ma per quanto riguarda la situazione in cui si sta postando il contenuto che include barre che sono supposte per essere lì, e non si desidera che vengano rimosse? – dsdsdsdsd

+1

@dsdsdsdsd: gestito .Le barre vengono eliminate solo se magic_quotes_gpc è attivo, quindi nella tua situazione le barre saranno state quotate e saranno convertite in barre non quotate da questo codice. – chaos

1

Un'altra soluzione per PHP 5.3+:

if (get_magic_quotes_gpc() === 1) 
{ 
    $_GET = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_GET, JSON_HEX_APOS | JSON_HEX_QUOT))), true); 
    $_POST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_POST, JSON_HEX_APOS | JSON_HEX_QUOT))), true); 
    $_COOKIE = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_COOKIE, JSON_HEX_APOS | JSON_HEX_QUOT))), true); 
    $_REQUEST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_REQUEST, JSON_HEX_APOS | JSON_HEX_QUOT))), true); 
} 

gestisce le chiavi, i valori e gli array multidimensionali.

+1

Funziona, ma rimuove anche le barre da altri caratteri di escape, come \ r e \ n, diventando "r" e "n" nel valore. –

+0

@Brian E: Grazie per il tuo feedback, hai ragione - Ho perso questo grande dettaglio! –

+0

@Brian E: Ho pubblicato una possibile correzione in https://github.com/alixaxel/phunction/issues/1#issuecomment-1039664. –