こんにちは、中山です。
別件の調査ついでに Web ブラウザ経由で処理を起動する各種スキーム …
- http:(URL)
- tel:(電話番号)
- mailto:(メールアドレス)
- data:(スクリプトを含む text/html コンテンツ)
- file:(ローカルファイル)
- javascript:(スクリプト)
とその起動方法 …
- HTTP Redirect レスポンスの Location: ヘッダから起動
- クライアントプル(META refresh)から起動
- リンク(A 要素)クリックから起動
- IFRAME 要素で読み込んで起動
- XMLHttpRequest で読み込んで起動
の組み合わせを、ブラウザ毎に動作検証してみました。
ちなみに data: スキームとは以下のようなものです。
data:text/html;base64,
PHNjcmlwdD5hbGVydCgiV2UgYXJlIFN5bmVyZ3lNYXJrZXRpbmchISIpOzwvc2NyaXB0Pg==
簡単なスクリプト(alert)が実行されるのでお試しください。
ブラウザ毎の処理結果
早速ですが上から Firefox, IE11, Chrome, Safari の結果です。
セルの色分けは以下の通りです。
- 青 : スキームに対応する処理が起動される
- 緑 : ユーザー確認を経て、スキームに対応する処理が起動される
- 紫 : スキームに対応する処理が起動されるが、エラーページが表示される
- 赤 : スキームに対応する処理が起動されない
結果ですが
- Firefox と Chrome はほぼ同様
- Safari は上記に近いが若干制限が緩やか
- IE11 は実行可否やユーザー確認有無の傾向が他ブラウザと異なる
ということが分かりました。
脆弱性(例えば XSS)との関連
外部から URL 情報をパラメータ等で入力し、出力コンテンツ内でそれを利用するようなシステムでは注意が必要です。
例えば data:xxx や javascript:xxx が入力され、表中の青いセルに該当する出力を生成した場合、任意のスクリプトを実行できてしまう危険性(= XSS)があるからです。
また「クライアントプル + tel: スキーム」で、ユーザー確認抜きで通話アプリを起動出来てしまう IE11 や Safari 仕様も怖いですね。危険なイタズラが出来てしまいそうです。
蛇足ですが、モバイル広告の Click to Call でも「クライアントプル + tel: スキーム」は活用されています。
これは、最初にクリックをトラッキングした後、レスポンスされるコンテンツ内で自動的に通話アプリを起動する仕組を実現するためです。
(とはいえ、通常のモバイル端末では電話発信前に確認のダイアログが出るのでご安心ください)
まとめ
あなたのシステムに上記「各種スキーム」が入力された場合、想定外の処理が実行される可能性はありませんか!?
Comments
スキームといえば
http://www.wdic.org/w/WDIC/x-avefront
こういうの懐かしいですね …
今は WebView のアプリも独自スキームから Native 機能を起動する実装が多いので、同様の問題がまた出てくるかもしれません。