[広告] テストデータ生成なら疑似個人情報ジェネレータ!! (People to People Communications 株式会社)
[広告] 疑似個人情報ジェネレータで個人情報漏洩対策!! (People to People Communications 株式会社)
携帯向けサイト | 過去の記事
気になるニュースや時事の話題を毎朝配信!世界と日本の未来を分析します。デジモノや料理の情報、WQXGAサイズの壁紙も。

[PHP] bitly の API Key を遮蔽する方法まとめ

| コメント(0) | トラックバック(0)

bitly API に javascript(json) からアクセスし、URLを短縮する方法を以前に紹介したが、この方法だと、APIキーを javascript に直接記述することになり、第三者にAPIキーを使われる危険がある。ここでは、PHPを使って、なるべく簡単にAPIキーを遮蔽する方法を紹介する。


1. 何が問題なのか

以前に紹介した方法は、非常に簡単に bitly API が使える反面、 javascript に直接 API Key を記述しなくてはならず、他の人に API Key が知られてしまう問題があります。

API Key が露呈すると、以下のような問題が起きる可能性があります。

  1. 悪意を持った第三者が、あなたの アカウント名と API Key を使って、bitly の API 利用制限の上限に引っかかるように大量のリクエストを送り、結果として、あなたの API Key を一時的に使えないようにする
  2. bitly の利用履歴(Link History : アクセス数などの情報もあるため、アクセス解析などに利用するケースもある)に、意図しない利用履歴が残る
いずれのケースも、業務妨害などの罪に問われる場合がある。他人の API Key を利用してはならない。


とはいえ、 bitly だけを使えなくするような実効性の薄い攻撃をしかける人は稀だとは思います。

対策としては、次のような方法が考えられます。

  1. API Key をときどき変える && 第三者に利用された形跡があったら、すぐに変更する
  2. PHPを使ってAPI Keyを遮蔽し、javascriptからはPHPにアクセスするようにする

API Key を変更するには、 bitly のページにアクセスして、ログインしていなかったらログインして、アカウント情報の API Key の横にある「reset」ボタンをクリックします。 API Key の変更は即時反映されるので、 javascript に記述した API Key もすぐに変更しましょう。

bitly の利用履歴を利用していないし、それほどアクセス数が多いわけでもないサイトの場合は、 API Key を変える対策で十分だと思われます。商用目的のサイトで bitly API を利用している場合には、bitlyが使えなくなるのは若干困りますので、以下に紹介する PHP を使った対策を行うと良いでしょう。


2. PHPの設置

bitlyproxy.txt をダウンロードして、拡張子を php に変えてください。ライセンスは クリエイティブ・コモンズ 表示 2.1 日本 です。改変・再配布・商用利用が可能です。

bitlyproxy.php で変更するのは以下の3点です。

1. bitly のユーザ名(アカウント名)

$login = "xxxxxxxx";

2. bitly の API Key

$apiKey = "R_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

3. ドメイン名

$domain = "example.jp";
ここで指定したドメインのURL以外は受け付けないようにします。不要な場合は何も記述しないままにします。


変更したら、phpファイルを自分のサーバにアップロードして、実行権限を付けてください。


3. javascript の変更

javascript から、ユーザ名と API Key を取り除き、リクエスト先の URL を api.bit.ly から、さきほど設置した php に変更します。

例えば、設置した php が、http://example.jp/bitlyproxy.php だとすると、

function tweet() {
    bitly = 'http://example.jp/bitlyproxy.php'
        + '?version=2.0.1&format=json'
        + '&callback=callback&longUrl=';
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = bitly + encodeURIComponent(location.href) ;
    document.body.appendChild(script);
}

となります。「ポップアップブロックを作動させずに別ウィンドウを開く」方法の場合も、同様に、ユーザ名と API Key を削除します(callbackのパラメータが違っているので注意)。


4. アフターケア

ここまでで対策は完了なのですが、最初に指摘した問題点1は解決していません。というのも、 http://example.jp/bitlyproxy.php に大量にアクセスされれば、bitly API の利用制限に引っかかるからです(とはいえ、レンタルサーバでは、bitlyよりも先に、自分のサーバがダウンしてしまう可能性の方が高いと思われます)。

そういったことが起きた場合には、通常のF5攻撃対応と同じように、.htaccessなどを使って、攻撃者のIPアドレスに対してアクセス禁止を設定するなどしましょう。


5. 謝辞

API Key が露呈する問題と対応については、daisuke furukawaさんからご指摘をいただきました。ありがとうございました!

JavaScriptで安易にAPIキーを使っちゃいけない - もぎゃろぐ


6. おまけ: PHP だけで bitly API を使うには

「PHPだけで bitly API を使えばいいんじゃね?」とか思った人は、こんなコードのPHPを作ると良いかもしれません。

<?php
    $login = "xxxxxxxx";
    $apiKey = "R_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    $longUrl = $_GET['longUrl'];
    $callback = $_GET['callback'];
    $bitly = "http://api.bit.ly/shorten?"
        . "version=2.0.1&format=json&callback=${callback}"
        . "&login=${login}&apiKey=${apiKey}&longUrl=${longUrl}";
    $response = file_get_contents($bitly);
    $json = @json_decode($response, TRUE);
    echo $json['results'][$longUrl]['shortUrl'];
?>
(試してないです、動かないかもしれません。)

トラックバック(0)

このブログ記事を参照しているブログ一覧: [PHP] bitly の API Key を遮蔽する方法まとめ

コメントする

コメントしても反応がない場合は、気が付いてないだけですので、Twitterなどでつっついてください。









    [広告] IL MILIONE ~世界の風景100撰~ 特大サイズ壁紙集 (People to People Communications 株式会社)