Fixes Issue #1421.
HistoryImplIE6 did a $doc.write of the unsanitized historyToken exposing an
XSS vulnerability. This fix adds html entity escaping to the token before
it is written.

Found by: akimpton
Review by: scottb, jgw



git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@1257 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/impl/HistoryImplIE6.java b/user/src/com/google/gwt/user/client/impl/HistoryImplIE6.java
index e56e037..c032343 100644
--- a/user/src/com/google/gwt/user/client/impl/HistoryImplIE6.java
+++ b/user/src/com/google/gwt/user/client/impl/HistoryImplIE6.java
@@ -15,6 +15,7 @@
  */
 package com.google.gwt.user.client.impl;
 
+import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Element;
 
 /**
@@ -22,7 +23,20 @@
  * {@link com.google.gwt.user.client.impl.HistoryImplFrame}.
  */
 class HistoryImplIE6 extends HistoryImplFrame {
-
+  
+  /**
+   * Sanitizes an untrusted string to be used in an HTML context. NOTE: This
+   * method of escaping strings should only be used on Internet Explorer.
+   * 
+   * @param maybeHtml untrusted string that may contain html
+   * @return sanitized string
+   */
+  private static String escapeHtml(String maybeHtml) {
+    final Element div = DOM.createDiv();
+    DOM.setInnerText(div, maybeHtml);
+    return DOM.getInnerHTML(div);
+  }
+  
   private static native void initUrlCheckTimer() /*-{
     // This is the URL check timer.  It detects when an unexpected change
     // occurs in the document's URL (e.g. when the user enters one manually
@@ -95,8 +109,7 @@
   }-*/;
 
   protected native void newItemImpl(Element historyFrame, String historyToken, boolean forceAdd) /*-{
-    historyToken = historyToken || "";
-
+    historyToken = @com.google.gwt.user.client.impl.HistoryImplIE6::escapeHtml(Ljava/lang/String;)(historyToken || "");
     if (forceAdd || ($wnd.__gwt_historyToken != historyToken)) {
       var doc = historyFrame.contentWindow.document;
       doc.open();