bitly API に javascript(json) からアクセスし、URLを短縮する方法を以前に紹介したが、この方法だと、APIキーを javascript に直接記述することになり、第三者にAPIキーを使われる危険がある。ここでは、PHPを使って、なるべく簡単にAPIキーを遮蔽する方法を紹介する。
1. 何が問題なのか
以前に紹介した方法は、非常に簡単に bitly API が使える反面、 javascript に直接 API Key を記述しなくてはならず、他の人に API Key が知られてしまう問題があります。
API Key が露呈すると、以下のような問題が起きる可能性があります。
- 悪意を持った第三者が、あなたの アカウント名と API Key を使って、bitly の API 利用制限の上限に引っかかるように大量のリクエストを送り、結果として、あなたの API Key を一時的に使えないようにする
- bitly の利用履歴(Link History : アクセス数などの情報もあるため、アクセス解析などに利用するケースもある)に、意図しない利用履歴が残る
とはいえ、 bitly だけを使えなくするような実効性の薄い攻撃をしかける人は稀だとは思います。
対策としては、次のような方法が考えられます。
- API Key をときどき変える && 第三者に利用された形跡があったら、すぐに変更する
- 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 だとすると、
となります。「ポップアップブロックを作動させずに別ウィンドウを開く」方法の場合も、同様に、ユーザ名と API Key を削除します(callbackのパラメータが違っているので注意)。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);
}
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'];
?>
コメントする
コメントしても反応がない場合は、気が付いてないだけですので、Twitterなどでつっついてください。