Twitter の XSS 関連、E4Xで作れば問題無し!

ボクも一応Twitterクライアントを作っているので気になるところ。
実を言うとあまり気にしていなかったりする実装なんだけど...一応問題なく動いている。

ボクのクライアントは、Firefox(Mozilla アプリ)上で動くことを前提としているJavaScriptである。

実装は以下のような感じ

const XHTML = new Namespace("xhtml","http://www.w3.org/1999/xhtml");
function formatText (str) {
  str = str.trim();
  let reg = /(?:https?:\/\/[\x21-\x7e]+)|(?:@\w{1,15})|(?:#\S+)/g;
  XML.ignoreWhitespace = false;
  let m, i = 0, buf = "", x = <xhtml:p class="twlist-text" xmlns:xhtml={XHTML}/>;
  while((m=reg.exec(str))){
    buf = str.substring(i, m.index);
    if (buf)
      x.appendChild(buf);
    let classValue = "twlist-link", href = "";
    switch (m[0].charAt(0)){
      case "@":
        classValue += " twlist-user";
        href = "http://twitter.com/" + m[0].substr(1);
        break;
      case "#":
        classValue += " twlist-hash";
        href = "http://twitter.com/search?q=%23" + m[0].substr(1);
        break;
      default:
        classValue += " twlist-url";
        href = m[0];
    }
    x.appendChild(<xhtml:a class={classValue} href={href}
                         onclick="twlist.onClick(event)" xmlns:xhtml={XHTML}>{m[0]}</xhtml:a>);
    i=reg.lastIndex;
  }
  buf = str.substr(i);
  if (buf)
    x.appendChild(buf);
  return x;
}

Mozillaアプリなので E4X を使っている。
E4Xならテキストノードや属性値に入る<,>,"等が自動でXML validなカタチに変換されるから安心! と言いたかっただけ。

まずい部分があったら教えて><