URIスキームの仕様
URIスキームの代表的なものには以下のようなものが存在します。
- http
- https
- javascript
通常URIスキームより前に文字列を入れると、URIスキームが正しく認識されなくなります。
"xss"http://example.com
しかしこの仕様は、HTMLのリンクでは回避することができます。
URIスキームの仕様を回避する
URIスキームの仕様をHTMLのリンクで回避するには、以下のような数値文字参照を使用します。
- 	
- 

- 
-  
 
は半角スペースで、以前の記事でも紹介したようにスキーム名の先頭に半角スペースを入れても動作するようになっています。



この2つは改行コードで、これも半角スペースと同じ働きをします。
最後に残った	
は見慣れない数値文字参照ですよね。
これは何かというと、HT
です。
分かりやすく言うと、水平タブ
のことです。
水平タブも、半角スペースと同じ働きをします。
これらの数値文字参照を使ったリンクをHTMLで生成すると、以下のようになります。
<a href=" javascript:alert(1)">xss</a>
もちろんこのリンクにアクセスをすると、きちんとjavascriptスキームが認識されてalert(1)が出てきます。
このような抜け道がURIスキームには存在するので、ユーザから入力されたURIをチェックする正規表現を作る際には気をつけてください。
httpとhttpsしか受け入れないようにホワイトリスト方式で正規表現を作ることも1つの手ですね。