Google Safe Browsing APIを使ってみる

先日リリースした短縮URLチェッカーで、元に戻した後のURLが危険なURLかどうかを判断するために、Google Safe Browsing APIを使うことにしました。このSafe Browsing APIはマルウェア配布サイト、フィッシングサイトのチェックができます。

日本語の解説ページがあまり無いようでしたので、今回はキーの取得から簡単な使い方までを書きたいと思います。

1.Safe Browsing APIキーを取得
まずは、Safe Browsing APIキーを取得します。キー取得の画面を表示し、「I have read and agree with the terms and conditions」にチェックを入れ、「Generate API Key」ボタンをクリックします。
Google Safe Browsing APIの利用規約

「Your key is:」とありますので、それがAPIのキーとなります。控えるのを忘れて、再度Generate API Keyボタンを押しても同じキーを取得できます。

Google Safe Browsing APIキー

2.Safe Browsing Lookup API Developer’s Guideを読む
Googleが用意しているドキュメントを読みます。英語ですので、日本語で解説しているページが無いか検索しましたがほとんど見つかりませんでした。仕方がなく読み始めましたが、最初はDeveloper’s Guide (v2)を読んだりと、読むページすらわかりませんでしたので、Safe Browsing Lookup API Developer’s Guideにたどり着くまで一苦労でした。

参考:実践的な英語を勉強したい方はMANABI.stという私が関わっているサイトがあります。こちらはコミュニケーションスキルなので、「読む」こととはちょっと違うかもしれませんが。

ドキュメント内のProtocol Specificationという箇所が参考になります。短縮URLチェッカーは1つのURLをチェックするためGETを使いましたが、複数のURLを一度にチェックする場合はPOSTを使う事になります。

3.サンプルコードの作成
GETリクエストの方法は下記のURLにアクセスすることになります。[CLIENT]は何か指定して下さい。例えばReverseShortURL等です。[APIKEY]は1で取得したキーを入力します。[APPVER]、[PVER]はそれぞれ1.5.2, 3.0を指定します。[URL]はチェックしたいURLを入力します。

https://sb-ssl.google.com/safebrowsing/api/lookup?client=[CLIENT]&apikey=[APIKEY]&appver=[APPVER]&pver=[PVER]&url=[URL]

普通であれば自分の環境にあった内容に変更した引数を入れ、そのURLをブラウザでアクセスすると結果がわかるのですが、Safe Browsing APIの場合はHTTPのヘッダで判定するため、ブラウザに表示されるのはフィッシングサイトかマルウェア配布サイトの時のみです。そのため、ヘッダも取得できるようにプログラミングする必要があります。

下記がサンプルコードです。[APIKEY]に1で取得したキーを入れます。また、$checkurlにチェックしたいURLを入力して実行して下さい。curlを使っているため、curlがインストールされていないサーバでは動作しません。CURLOPT_HEADERを指定することでヘッダを表示させています。

<?php
$apikey = "[APIKEY]";
$checkurl = "http://www.poitan.net/";

$url = "https://sb-ssl.google.com/safebrowsing/api/lookup?client=ReverseShortURL&apikey=" . $apikey . "&appver=1.5.2&pver=3.0&url=" . urlencode ($checkurl);
$ua = "ReverseShortURL/1.0 (+http://x-1.jp/)";
$ch = curl_init ();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_HEADER, 1);
curl_setopt ($ch, CURLOPT_USERAGENT, $ua);
$data = curl_exec ($ch);
curl_close ($ch);

print_r ($data);
?>

上記のプログラムを実行すると下記のような結果が表示されます。

HTTP/1.1 204 No Content
Content-Type: application/octet-stream
X-Content-Type-Options: nosniff
Date: Fri, 19 Aug 2011 02:06:14 GMT
Server: Hash Suffix Server
Content-Length: 0
X-XSS-Protection: 1; mode=block

Content-Lengthを見てもわかるとおり、コンテンツは何も返ってきません。注目するところは、HTTP/1.1 204です。Googleのドキュメントを見ると下記のように書かれています。括弧内は私のアバウトな和訳ですので参考程度に読んで下さい。

  • 200: The queried URL is either phishing, malware or both, see the response body for the specific type. (リクエストURLはフィッシングサイト、マルウェア配布サイトまたは両方です。詳しくはコンテンツを確認してください。)
  • 204: The requested URL is legitimate, no response body returned. (リクエストURLは問題ありません。コンテンツは返しません。)
  • 400: Bad Request — The HTTP request was not correctly formed. (HTTPリクエストのフォーマットが間違っています。)
  • 401: Not Authorized — The apikey is not authorized (APIキーが間違っています。)
  • 503: Service Unavailable — The server cannot handle the request. Besides the normal server failures, it could also indicate that the client has been “throttled” by sending too many requests (サーバがリクエストを処理できません。リクエストを大量に送っている可能性もあります。)

今回は204が返ってきているので$checkurl (http://www.poitan.net/) は問題ないURLということがわかります。フィッシング詐欺のデモサイトとしてGoogleのドキュメントに書かれているのがhttp://www.phishing.com/で、$checkurlに入れてチェックした所、こちらも204が返ってきます。ドキュメントにはフィッシングのリストに入っていると書かれているのですが、何度やっても204ですので、リストから外されたのでしょう。

どこのサイトで見つけたか忘れましたが、マルウェアのチェックサイトとしてはhttp://malware.testing.google.test/testing/malware/を使うと良さそうです。こちらを$checkurlに入れて実行してみます。

HTTP/1.1 200 OK
Content-Type: application/octet-stream
X-Content-Type-Options: nosniff
Date: Fri, 19 Aug 2011 02:22:13 GMT
Server: Hash Suffix Server
Content-Length: 7
X-XSS-Protection: 1; mode=block
Expires: Fri, 19 Aug 2011 02:22:13 GMT
Cache-Control: private

malware

実行すると上記のメッセージが表示され、HTTP/1.1 200になっておりますのでフィッシングサイトかマルウェア配布サイトか、両方かのどれかです。Content-Lengthが7となっていますので、コンテンツ部分を見るとmalwareと表示されているため、マルウェア配布サイトと言う判定ができます。

参考URLがマルウェア配布サイトのものしかないため、フィッシングサイトのチェックや両方のチェックはできませんが、返ってくる値は下記の3種類のようです。

phishing
malware
phishing,malware

この3種類のチェックをすれば危険なサイトのチェックができますので、何かツールを作る場合は参考にして下さい。

Google Safe Browsing APIを使ってみる” への1件のコメント

  1. ピンバック:Google Safe Browsing APIの仕様について | 備忘録

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください