URLは,
攻撃者の視点から見ると,
また,
今回は,
URLは想像以上に複雑なもの
URLは,
JavaScript上でURLをデータとして取り扱う場合,
「Webアプリケーションで取り扱うURL」
プロトコルスキームだけでもさまざまのバリエーションが
上記はいずれもhttpスキームを指すURLですが,
さらに,
プロトコルスキームだけでもこれだけのバリエーションがあり,
URLを基準にセキュリティ上の境界条件を定めていると, 脆弱性につながる可能性が
URLを基準にセキュリティ上の境界条件を定めたコードを書くと,
実際にJavaScript上のコードにおいては,
- オープンリダイレクトが発生しないように,
リダイレクト先のURLが現在のURLと同じサイトか調べる - <a>要素のhref属性として設定するリンク先URLがjavascriptスキームやvbscriptスキームでないか調べる
- XMLHttpRequestで接続しようとしているリソースが現在のURLと同じサイトか調べる
(※)
こういった場面でURLの取り扱いにまちがいがあると,
// bad code
// 与えられたURLが特定のサイトかどうかを判断する
function checkUrl( url ){
var validSites = [ "http://example.jp", "http://example1.jp" ];
var i, site;
for( i = 0; i < validSites.length; i++ ){
site = validSites[ i ];
if( url.substr( 0, site.length ) === site ){
return true;
}
}
return false;
}
このcheckUrlという関数は,
そのため,
経験を積んだプログラマならこのコードを見た瞬間にまちがいに気づくくらい,
具体的な対策方法については,
- ※)
- 現在のXMLHttpRequestは,
任意のサイトと接続可能です。