Domanda

Ho un po 'di problemi a creare un modulo appiccicoso che ricorderà cosa è stato inserito al momento dell'invio del modulo se il valore ha virgolette doppie. Il problema è che l'HTML dovrebbe leggere qualcosa del tipo:

<input type="text" name="something" value="Whatever value you entered" />

Tuttavia, se la frase: " Come posso fare? " viene digitato tra virgolette, il codice HTML risultante è simile a:

<input type="text" this?="" do="" i="" how="" value="" name="something"/>

Come dovrei filtrare le doppie virgolette? L'ho provato con citazioni magiche accese e spente, ho usato strisce e aggiunte, ma finora non ho trovato la soluzione giusta. Qual è il modo migliore per aggirare questo problema per PHP?

È stato utile?

Soluzione

Desideri htmlentities () .

<input type="text" value="<?php echo htmlentities($myValue); ?>">

Altri suggerimenti

Quanto sopra codificherà tutti i tipi di caratteri con codice entità html. Preferisco usare:

htmlspecialchars($myValue, ENT_QUOTES, 'utf-8');

Questo codificherà solo:

'&' (ampersand) becomes '&amp;'
'"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set.
''' (single quote) becomes '&#039;' only when ENT_QUOTES is set.
'<' (less than) becomes '&lt;'
'>' (greater than) becomes '&gt;'

Potresti anche fare uno strip_tags su $ myValue per rimuovere i tag html e php.

Questo è quello che uso:

htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_DISALLOWED | ENT_HTML5, 'UTF-8')
  • ENT_QUOTES dice a PHP di convertire le virgolette singole e doppie, che trovo desiderabile.
  • ENT_SUBSTITUTE e ENT_DISALLOWED gestiscono Unicode non valido. Sono abbastanza simili - per quanto ho capito, il primo sostituisce sequenze di unità di codice non valide, ovvero caratteri o sequenze codificati non validi che non rappresentano caratteri , mentre il secondo sostituisce punti di codice non validi per il documento dato digitare, ovvero caratteri non consentiti per il tipo di documento specificato (o il valore predefinito se non specificato esplicitamente). La documentazione è indesiderabilmente laconica su di essi.
  • ENT_HTML5 è il tipo di documento che utilizzo. Puoi usarne uno diverso, ma dovrebbe corrispondere al tipo di pagina.
  • UTF-8 è la codifica del mio documento. Suggerisco che, a meno che tu non sia assolutamente sicuro di usare PHP 5.4.0, specifichi esplicitamente la codifica, specialmente se hai a che fare con un testo non inglese. Un host su cui lavoro un po 'usa 5.2.something, che per impostazione predefinita è ISO-8859-1 e produce incomprensibili.

Come suggerisce thesmart , htmlspecialchars codifica solo caratteri HTML riservati mentre htmlentities converte tutto ciò che ha una rappresentazione HTML. Nella maggior parte dei contesti farà il lavoro. Qui è una discussione sull'argomento.

Ancora una cosa: è una buona pratica tenere disabilitate le citazioni magiche poiché danno un falso senso di sicurezza e sono deprecate in 5.3.0 e rimosse da 5.4.0. Se sono abilitati, ogni preventivo nei tuoi campi sarà preceduto da una barra rovesciata sul postback (e più postback aggiungeranno sempre più barre). Vedo che l'OP è in grado di modificare l'impostazione, ma per riferimenti futuri: se sei su un host condiviso o altrimenti non hai accesso a php.ini, il modo più semplice è aggiungere

php_flag magic_quotes_gpc Off

nel .htaccess file.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top