2013-02-08 13 views
6

In meinem älteren Projekt kann ich die Verwendung von escapeHtml sehen, bevor die Zeichenfolge an den Browser gesendet wird.Wenn ich HTML-String entkommen muss?

StringEscapeUtils.escapeHtml(stringBody); 

Ich weiß von api doc was escape does.here das Beispiel gegeben ist: -

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

Mein Verständnis ist, wenn wir die Zeichenfolge nach der Flucht html seiner der Browser Verantwortung, die zurückschicken umwandelt ursprüngliche Charaktere. Ist das richtig?

Aber ich bekomme nicht warum und wann es erforderlich ist und was passiert, wenn wir den String-Körper senden, ohne html zu entkommen? Was ist der Preis, wenn wir nicht escapeHtml tun, bevor Sie es an den Browser senden

Antwort

9

ich von mehreren Möglichkeiten denken kann, zu erklären, warum manchmal ein String nicht entgangen ist:

  • vielleicht der ursprüngliche Programmierer war zuversichtlich, dass die Zeichenfolge an bestimmten Stellen keine Sonderzeichen hatten (allerdings wäre dies meiner Meinung nach Programmieren ist schlecht, es kostet sehr wenig, um einen String als Schutz gegen zukünftige Änderungen zu entgehen)
  • Die Zeichenfolge wurde bereits an dieser Stelle im Code entfernt. Du willst auf keinen Fall zweimal einer Saite entkommen; Der Benutzer wird dann die Escape-Sequenz anstelle des beabsichtigten Textes sehen.
  • Die Zeichenfolge war das eigentliche HTML selbst. Sie wollen dem HTML nicht entkommen; Sie möchten, dass der Browser es verarbeitet!

EDIT - Der Grund für die Flucht ist, dass Sonderzeichen wie & und < kann am Ende der Browser verursacht etwas anderes als zeigen, was Sie bestimmt. Ein blankes & ist technisch ein Fehler im HTML. Die meisten Browser versuchen, solche Fehler intelligent zu behandeln und werden sie in den meisten Fällen korrekt anzeigen. (Dies wird mit ziemlicher Sicherheit in Ihrem Beispieltext passieren, wenn die Zeichenfolge z. B. Text in einer <div> war.) Da es sich jedoch um ein schlechtes Markup handelt, funktionieren einige Browser nicht gut. Hilfstechnologien (z. B. Text-zu-Sprache) können fehlschlagen; und es kann andere Probleme geben.

Es gibt mehrere Fälle, die trotz der besten Bemühungen des Browsers, sich von schlechtem Markup zu erholen, scheitern werden. Wenn Ihre Beispielzeichenfolge ein Attributwert wäre, wäre das Umgehen der Anführungszeichen unbedingt erforderlich. Es gibt keine Möglichkeit, dass ein Browser etwas richtig handhaben wird, wie:

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

Die allgemeine Regel ist, dass jedes Zeichen, das nicht Markup, sondern könnte als Markup verwechselt werden muß maskiert werden.

Beachten Sie, dass es mehrere Kontexte gibt, in denen Text in einem HTML-Dokument angezeigt werden kann, und sie separate Anforderungen für das Escaping aufweisen. Innerhalb von Attributwerten müssen Sie die Anführungszeichen und das kaufmännische Und-Zeichen (aber nicht <) umgehen. Sie müssen Zeichen, die keine Repräsentation im Zeichensatz des Dokuments haben, fliehen (unwahrscheinlich, wenn Sie UTF-8 verwenden, aber das ist nicht immer der Fall).Innerhalb der Textknoten müssen nur & und < maskiert werden. Innerhalb von href-Werten müssen Zeichen, die in einer URL maskiert werden müssen, maskiert werden (und manchmal doppelt maskiert werden, sodass sie immer noch maskiert werden, nachdem der Browser sie einmal ausgeblendet hat). Innerhalb eines CDATA-Blocks sollte im Allgemeinen nichts (auf der HTML-Ebene) maskiert werden.

Schließlich, abgesehen von der Gefahr der Doppel-Flucht, die Kosten für die Flucht alle Texte ist minimal: ein kleines bisschen zusätzliche Verarbeitung und ein paar zusätzliche Bytes im Netzwerk.

+0

Ted Noch einmal meine Frage ist, wie HTML entkommt, bevor Sie es an den Browser senden? Wenn wir es nicht tun, was kostet das? –

+0

@MSach - Ich erweiterte meine Antwort. –

+0

Danke Ted für die ausführliche Erklärung. Eine weitere Frage ist, wenn wir das Zeichen & lt an den Browser senden, konvertiert Browser das Zeichen (in diesem Fall & lt zu <) automatisch, bevor es gerendert wird? –

2

müssen Sie HTML oder XML entkommen, wenn es eine Möglichkeit gibt, dass es zusammen mit der Seite generiert HTML (lesen Jsp) interpretiert werden kann.

dieses gute question erklärt es auch.

3

HTML (heutzutage würden wir besser XML sagen) definiert viele sogenannte "spezielle" Zeichen, was bedeutet, dass diese Zeichen eine besondere Bedeutung für den Browser haben, im Gegensatz zu "normalen" Zeichen, die nur sich selbst bedeuten. Beispielsweise enthält die Zeichenfolge "Hello, World!" nur "normale" Zeichen und bedeutet somit wörtlich "Hello, World!" für den Browser. String "<b>Hello, World!</b>", enthält Sonderzeichen '<', '>' und '/', und für den Browser bedeutet dies: typeset string "Hello, World!" in bold statt nur typeset "<b>Hello, World!</b>".

Methode escapeHtml (String) wahrscheinlich (ich kann nicht sicher sagen, weil ich nicht weiß, wie es implementiert ist) konvertiert beliebige Zeichenfolge in HTML-Code, der Browser anweisen wird, diese Zeichenfolge buchstäblich zu setzen. Beispiel: escapeHtml ("<b>Hello, World!</b>") wird HTML-Code zurückgeben, der vom Browser als typeset "<b>Hello, World!</b>" normally anstelle von typeset string "Hello, World!" in bold interpretiert wird. Wenn die Methode escapeHtml (String) korrekt implementiert ist, sollte es Ihnen egal sein, wie der von dieser Methode erzeugte HTML-Code aussieht. Verwenden Sie es einfach dort, wo Sie den Browser bitten möchten, eine Zeichenfolge wortwörtlich zu setzen.

1

Aus meiner Erfahrung sollten alle Zeichenfolgen von HTML maskiert werden, bevor sie auf der Seite angezeigt werden. In unserem aktuellen Projekt geht es darum, alle Organisationseinheiten aus dem Active Directory zu verwalten, und diese Einheiten können beliebige Sonderzeichen (einschließlich HTML-Zeichen) enthalten. Wenn man auf der Seite angezeigt wird, können Sie mit dem folgenden Code am Ende genannt, einen Datensatz zu zeigen User <Marketing>

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

, nachdem die Seite gerendert wird, wird es

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

werden, die als User Hyperlink erscheint tatsächlich auf Die Seite.

Wenn Sie jedoch den HTML-Wert entkommen, bevor Sie auf die Seite zu senden

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

, nachdem die Seite gerendert wird, wird es sich

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

die

korrekt auf der JSP-Seite angezeigt

Kurz gesagt, verwenden Sie Escaping-HTML-Zeichen, um die spezielle Eingabe zu verhindern. Wenn die Eingabe das HTML-Zeichen enthält, wird Ihre Seite beim Rendern falsch angezeigt

Verwandte Themen