2013-02-08 13 views
6

Nel mio progetto precedente posso vedere l'uso di escapeHtml prima che la stringa venga inviata al browser.Quando ho bisogno di sfuggire alla stringa Html?

StringEscapeUtils.escapeHtml(stringBody); 

so via api doc ciò escapeHTML does.here è l'esempio dato: -

For example: 
"bread" & "butter" 
becomes: 
"bread" & "butter". 

mia comprensione è quando inviamo la stringa dopo la fuga html sua la responsabilità del browser che converte di nuovo a personaggi originali È giusto?

Ma non capisco perché e quando è richiesto e cosa succede se inviamo il corpo della stringa senza sfuggire all'html? qual è il costo se non eseguiamo escapeHtml prima di inviarlo al browser

risposta

9

mi viene in mente diverse possibilità per spiegare il motivo per cui a volte una stringa non è sfuggito:

  • forse il programmatore originale era fiducioso che in certi luoghi la stringa non aveva i caratteri speciali (tuttavia, a mio parere questo sarebbe essere una cattiva pratica di programmazione, costa pochissimo sfuggire a una stringa come protezione contro modifiche future)
  • la stringa era già stata scappata in quel punto nel codice. Sicuramente non vuoi sfuggire a una stringa due volte; l'utente vedrà la sequenza di escape invece del testo previsto.
  • La stringa era l'html stesso. Non vuoi sfuggire all'html; vuoi che il browser lo elabori!

EDIT - La ragione per sfuggire è che i caratteri speciali come & e < possono finire per causare il browser per visualizzare qualcosa di diverso da quello che intendeva. Un semplice & è tecnicamente un errore nell'html. La maggior parte dei browser cerca di gestire in modo intelligente tali errori e li visualizza correttamente nella maggior parte dei casi. (Questo succederà quasi sicuramente nel testo di esempio se la stringa fosse testo in un <div>, ad esempio.) Tuttavia, poiché è un markup errato, alcuni browser non funzioneranno correttamente; le tecnologie assistive (ad es., da testo a parlato) potrebbero fallire; e potrebbero esserci altri problemi.

Ci sono diversi casi che falliranno malgrado i migliori sforzi del browser per recuperare dal markup negativo. Se la tua stringa campione fosse un valore di attributo, sarebbe assolutamente necessario sfuggire alle virgolette. Non c'è modo che un browser sta per gestire correttamente qualcosa come:

<img alt=""bread" & "butter"" ... > 

La regola generale è che ogni personaggio che non è markup ma potrebbe essere confuso come markup deve essere sfuggito.

Si noti che esistono diversi contesti in cui il testo può apparire all'interno di un documento html e hanno requisiti separati per l'escape. All'interno dei valori degli attributi, è necessario evitare le virgolette e la e commerciale (ma non <). È necessario sfuggire ai caratteri che non hanno alcuna rappresentazione nel set di caratteri del documento (improbabile se si utilizza UTF-8, ma non è sempre il caso).All'interno dei nodi di testo, è necessario eseguire l'escape solo per & e <. All'interno dei valori href, i caratteri che devono essere salvati in un url devono essere sfuggiti (e talvolta doppiamente scappati in modo che siano ancora sfuggiti dopo che il browser li ha scovati una volta). All'interno di un blocco CDATA, generalmente nulla deve essere sfuggito (a livello HTML).

Infine, a parte il rischio di doppia escape, il costo di sfuggire a tutto il testo è minimo: un po 'di elaborazione extra e pochi byte in più sulla rete.

+0

Ted Anche in questo caso la mia domanda è che le fughe di HTML aiuta befoew inviarlo al browser? Se noi non farlo qual è il costo? –

+0

@MSach - Ho ampliato la mia risposta. –

+0

Grazie Ted per la spiegazione dettagliata. Un'altra domanda è quando inviamo il carattere & lt al browser, il browser converte automaticamente quel carattere (in questo caso & lt a <) prima di renderlo? –

2

devi sfuggire html o xml quando esiste la possibilità che venga interpretato insieme all'html generato dalla pagina (leggi jsp).

questo bene question lo spiega anche.

3

HTML (al giorno d'oggi ci sarebbe meglio dire XML) definisce molti personaggi cosiddetti "speciali", il che significa che questi personaggi hanno un significato speciale per il browser in contrasto con i caratteri "normali" che significa solo se stessi. Ad esempio, la stringa "Hello, World!" contiene solo caratteri "normali" e quindi letteralmente significa "Hello, World!" per il browser. String "<b>Hello, World!</b>", contiene caratteri speciali '<', '>' e '/', e per browser significa: typeset string "Hello, World!" in bold anziché solo typeset "<b>Hello, World!</b>".

Il metodo escapeHtml (String) probabilmente (non posso dirlo con certezza perché non so come è implementato) converte una stringa arbitraria in codice HTML che istruirà il browser a comporre letteralmente questa stringa. Ad esempio, escapeHtml ("<b>Hello, World!</b>") restituirà il codice HTML che verrà interpretato dal browser come typeset "<b>Hello, World!</b>" normally anziché typeset string "Hello, World!" in bold. Se il metodo escapeHtml (String) è implementato correttamente, non ti interessa sapere come si presenta il codice HTML prodotto con questo metodo. Basta usarlo dove vuoi chiedere al browser di comporre alcune stringhe letteralmente.

1

Dalla mia esperienza, tutte le stringhe dovrebbero essere preceduti da HTML prima di essere visualizzato sulla pagina. Il nostro attuale progetto riguarda la gestione di tutte le unità organizzative da Active Directory e queste unità potrebbero contenere qualsiasi carattere speciale (incluso il carattere Html). Durante la visualizzazione della pagina, si potrebbe finire con il seguente codice per mostrare un disco intitolato User <Marketing>

<a href="viewDetail.do"> <%=request.getAttribute("Name");%> </a> 

dopo la pagina viene visualizzata, diventerà

<a href="viewDetail.do"> User <Marketing> </a> 

che in realtà appare come User collegamento ipertestuale la pagina.

Tuttavia, se si sfuggire il valore Html prima di inviare alla pagina

request.setAttribute("Name", StringEscapeUtils.escapeHtml("User <Marketing>")); 

dopo la pagina viene visualizzata, diventerà

<a href="viewDetail.do"> User &lt;Marketing&gt; </a> 

che appaiono correttamente sulla pagina JSP

In breve, si usano caratteri di escape Html per impedire l'input speciale. Se l'ingresso contiene il carattere HTML, la pagina apparirà sbagliato durante il rendering

Problemi correlati