Con “virgolette” disabilitate, perché PHP / WordPress continua a sfuggire automaticamente i miei dati POST?

È una domanda semplice con una risposta stranamente sfuggente.

get_magic_quotes_gpc() riporta 0. Ripeto, le virgolette sono spente. Le virgolette magiche sembrano essere state disabilitate in php.ini (non in fase di runtime).

Ciononostante, tutti i dati POST compresi virgolette singole (‘) sono sfuggiti quando si accede in PHP. Che cosa potrebbe causare questo?

Grazie.


Modifica: Per i curiosi, questo è uno screenshot del nostro phpinfo: http://img843.imageshack.us/img843/6959/screenshot20120120at552.png


Modifica: mentre preparavo un caso di test, ho scoperto l’origine generale del problema. Stiamo eseguendo il bootstrap di WordPress mentre la nostra app si integra con un’installazione Multisite WP. Quando disabilito il bootstrap di WordPress, l’auto-escaping è disabilitato. Qualcuno sa dove si trova il codice di escape automatico di WordPress?

Penso di averlo trovato. Problema (bug): http://core.trac.wordpress.org/ticket/18322

Soluzione: http://codex.wordpress.org/Function_Reference/stripslashes_deep

  $_GET = array_map('stripslashes_deep', $_GET); $_POST = array_map('stripslashes_deep', $_POST); $_COOKIE = array_map('stripslashes_deep', $_COOKIE); $_SERVER = array_map('stripslashes_deep', $_SERVER); $_REQUEST = array_map('stripslashes_deep', $_REQUEST); 

Nota: come suggerito da @Alexandar O’Mara, potresti voler riconsiderare la sovrascrittura dei superglobali come questo. Se è appropriato per la tua situazione, ad esempio, potresti semplicemente ” $post = array_map('stripslashes_deep', $_POST); strip locale” usando un’alternativa come $post = array_map('stripslashes_deep', $_POST);

Vedi anche l’eccellente risposta di @shiftshiftin.

Espandere la risposta di @ rinogo con una spiegazione più approfondita e offrire un’altra soluzione alternativa.


In wp-settings.php c’è una chiamata incondizionata a wp_magic_quotes

 // Add magic quotes and set up $_REQUEST ( $_GET + $_POST ) wp_magic_quotes(); 

WordPress sfugge alle citazioni, non importa cosa

 function wp_magic_quotes() { // If already slashed, strip. // Escape with wpdb. // Force REQUEST to be GET + POST. } 

La cosa interessante è che questa chiamata viene effettuata dopo aver caricato i plugin, prima che il tema venga caricato. Sooo, nella parte superiore del tuo plugin

 // A hack to cope with un-configurable call to wp_magic_quotes // EG Make the original $_POST available through a global $_REAL_POST $_REAL_GET = $_GET; $_REAL_POST = $_POST; $_REAL_COOKIE = $_COOKIE; $_REAL_REQUEST = $_REQUEST; 

Quindi puoi usare liberamente $_REAL_POST e al posto di $_POST (ricordando che è globale e non superglobale ) dove è necessario. Ricorda inoltre che mentre il tuo plugin è stato caricato prima del tema, se il tema chiama in una delle funzioni del plugin che usa $_POST , dovrebbe leggere da $_REAL_POST per ottenere i valori senza caratteri.

La migliore risposta fornita qui è quella di copiare per uso personale come:

 $post = array_map('stripslashes_deep', $_POST); 

C’è un problema teorico con questo però: dal momento che stai lavorando con un duplicato, non puoi persistere alcuna modifica ai superglobali (hey, non sto dicendo che è una buona pratica, va bene?).

Soluzione: metodi di accesso

Nel tentativo di risolvere questo pasticcio in un modo definito e senza effetti collaterali, ho creato “metodi accessor” che applicano in modo trasparente stripslashes_deep() o addslashes_deep()* per ottenere / impostare richieste ai seguenti array superglobali:

* Ho dovuto addslashes_deep() insieme da addslashes_deep() di WordPress.

  • $_GET
  • $_POST
  • $_COOKIE
  • $_SERVER
  • $_REQUEST

Puoi usarli come:

 echo _get('username'); // echo stripslashes_deep($_GET['username']); _cookie('name', 'value'); // $_COOKIE['name'] = addslashes_deep('value'); 

Ecco il codice (lo chiamo gpcsr.php ):

 $data) { $value->{$key} = addslashes_deep( $data ); } } elseif ( is_string( $value ) ) { $value = addslashes($value); } return $value; } function _generic_slashes_wrap(&$arr, $key, $value = null) { if (func_num_args() === 2) return stripslashes_deep($arr[$key]); else $arr[$key] = addslashes_deep($value); } function _get ($key, $value = null) { if (func_num_args() === 1) return _generic_slashes_wrap($_GET, $key); else _generic_slashes_wrap($_GET, $key, $value); } function _post ($key, $value = null) { if (func_num_args() === 1) return _generic_slashes_wrap($_POST, $key); else _generic_slashes_wrap($_POST, $key, $value); } function _cookie ($key, $value = null) { if (func_num_args() === 1) return _generic_slashes_wrap($_COOKIE, $key); else _generic_slashes_wrap($_COOKIE, $key, $value); } function _server ($key, $value = null) { if (func_num_args() === 1) return _generic_slashes_wrap($_SERVER, $key); else _generic_slashes_wrap($_SERVER, $key, $value); } function _request ($key, $value = null) { if (func_num_args() === 1) return _generic_slashes_wrap($_REQUEST, $key); else _generic_slashes_wrap($_REQUEST, $key, $value); } ?> 

Ho appena avuto a che fare con questo problema e ho trovato quello che penso sia una soluzione abbastanza carina. Assicura che i GPC non vengano mai tagliati. Ho appena messo questo nella parte superiore del mio file di plugin (anch’esso funzionerebbe nella parte superiore di un tema, penso):

 add_action( 'init', 'unslash_gpc' ); function unslash_gpc() { $_GET = array_map('stripslashes_deep', $_GET); $_POST = array_map('stripslashes_deep', $_POST); $_COOKIE = array_map('stripslashes_deep', $_COOKIE); $_SERVER = array_map('stripslashes_deep', $_SERVER); $_REQUEST = array_map('stripslashes_deep', $_REQUEST); } 

E ora tutto è perfetto!

WordPress fornisce una soluzione per questo utilizzando la funzione wordpress stripslashes_deep . Quindi, i frammenti menzionati nella risposta di @ rinogo diventerebbero:

 $_GET = stripslashes_deep($_GET); $_POST = stripslashes_deep($_POST); $_COOKIE = stripslashes_deep($_COOKIE); $_REQUEST = stripslashes_deep($_REQUEST); 

Inoltre una nota, wordpress non dice nulla sulla variabile globale $_SERVER , quindi suppongo che non sia influenzata.

WordPress aggiunge barre a $ _POST / $ _ GET / $ _ REQUEST / $ _ COOKIE indipendentemente da ciò che ottiene get_magic_quotes_gpc (). Pertanto, nel contesto di WordPress, stripslashes () o stipslashes_deep () devono sempre essere utilizzati quando si utilizzano tali variabili.

Oppure, fai come ho fatto io. Commenta tutta l’implementazione nel metodo wp_magic_quotes () di load.php.

Non ho bisogno di citazioni magiche. Questo mi stava causando molti più mal di testa di quello che valeva. Personalmente, preferisco mantenere la mia disciplina di igiene ambientale. Semplicemente non voglio iniziare a formare cattive abitudini di programmazione.

Ma, capisco l’obbligo di WordPress di includere una tale “caratteristica”. Forse la comunità di sviluppo sarebbe meglio servita con un’opzione globale per disabilitarlo.