Twitter の XSS 関連、E4Xで作れば問題無し!
- Kazuho@Cybozu Labs: (Twitter の XSS 脆弱性に関連して) 構造化テキストの正しいエスケープ手法について
- 404 Blog Not Found:構造化テキストの間違ったエスケープ手法について
- XSSしないやつ - zorioの日記
ボクも一応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なカタチに変換されるから安心! と言いたかっただけ。
まずい部分があったら教えて><