javascriptによる攻撃の被害者・加害者にならないために注意すべきこと

はじめに

自分用のメモがてら書いてきます。
僕もまだまだ素人なんで、つっこみ大歓迎です。

目に見えることが真実とは限らない

リンクを使った引っ掛けの例です。


初級:リンク先と表示されている文字が違う

<a href="http://bbb.com">aaa</a>

エロサイトでよく見かけますねw
これは、ステータスバー見れば違うのがすぐわかります。


中級:リンク先と表示されている文字は一緒だけれど、いざ飛ぶと違うページ

<script charset="UTF-8" type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js"></script>
<script type='text/javascript' language='javascript' charset='utf-8'>
  Event.observe(window, 'load', function()
  {
    var a = $$('a')[0];
    Event.observe(a, 'click', function(event)
    {
      a.href = 'http://bbb.com';
    });
  });
</script>
<a href="http://aaa.com">aaa</a>

リンクをクリックした瞬間にリンク先を書き換えてます。
この辺から、見た目じゃわかりません。


上級:任意のスクリプト実行

<script charset="UTF-8" type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js"></script>
<script type='text/javascript' language='javascript' charset='utf-8'>
  Event.observe(window, 'load', function()
  {
    var a = $$('a')[0];
    Event.observe(a, 'click', function(event)
    {
      $$('form')[0].submit();
      Event.stop(event);
    });
  });
</script>
<a href="http://aaa.com">aaa</a>
<form action="http://bbb.com" style="display:none">
  <input name="title" value="爆破します">
  <input name="body" value="うそです">
</form>

リンクで飛ぶ代わりに怪しげなフォーム送信しちゃってます。

どうすれば防げる?(ユーザ)

信用できないサイトではjavascriptを無効に。


firefoxなら、ツール->オプション->コンテンツ
から、JavaScriptを有効にするのチェック外せば無効にできます。

ページ単位で有効・無効を切り替えられるアドオンもあります。
https://addons.mozilla.org/ja/firefox/addon/722

どうすれば防げる?(管理者)

上記の例で言うと、フォームデータのリファラ見て不適切な場合は投稿を受け付けない。
フォームにワンタイムトークン仕込んでおく。

さいごに

javascriptは、もっと楽しいことに使おうよ。
許可した処理だけ実行可能にするUserScript欲しいな。