Google、大好き!API、大好き!!
何も苦労せず、ほぼ正確な”答え”が返ってくるGoogle先生のAPI。
以前、不適切な画像を検出するためにCloud Vision APIをご紹介しました。
今回は、マルウェアやフィッシングコンテンツのない安全なWEBサイトかどうかを判断してくれる「Safe Browsing API」を、PHPで利用する方法をご紹介します。
Safe Browsing APIとは
Safe Browsing APIは、Googleが提供するウェブサイトのセキュリティに関する情報を提供するAPIです。
このAPIを使用することで、ウェブサイトが安全かどうかを判断することができます。
Safe Browsing APIは、ウェブサイトがマルウェアやフィッシング詐欺などの脅威から保護されているかどうかを確認するために使用されます。
APIリクエストを送信すると、レスポンスとして、ウェブサイトがGoogle Safe Browsingのリストに含まれているかどうかを示す情報が返されます。
レスポンスには、ウェブサイトがマルウェア、フィッシング、スペイムなどのリストに含まれているかどうか、および該当するリストの種類が含まれます。
Safe Browsing APIの使い方
Safe Browsing APIを使用するには、Google Developers ConsoleでAPIキーを取得する必要があります。
APIキーを取得したら、APIを使用するためのクライアントライブラリを選択し、APIリクエストを送信することができます。
クライアントライブラリは、Java、Python、PHP、Ruby、.NET、Go、Node.jsなどのプログラミング言語で使用することができます。
以下の参考サイトには、Google APIの利用登録方法から、簡単な使い方まで掲載されていますので、もし登録がお済みでない方はぜひご覧ください。
公式サイトの日本語版はなさそうですが、これまたGoogleの翻訳機能があれば問題ないでしょう。
PHPサンプルコード
以下は、WEBサイトが不適切でないか判断をする関数を作成したものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
public function is_safe_browse($url) { try { $postUrl = 'https://safebrowsing.googleapis.com/v4/threatMatches:find?key=[GOOGLE_API_KEY]'; $payload = [ 'client' => [ 'clientId' => [CLIENT_ID], 'clientVersion' => [CLIENT_VERSION], ], 'threatInfo' => [ "threatTypes" => [ 'THREAT_TYPE_UNSPECIFIED', 'MALWARE', 'SOCIAL_ENGINEERING', 'UNWANTED_SOFTWARE', 'POTENTIALLY_HARMFUL_APPLICATION', ], "platformTypes" => [ 'PLATFORM_TYPE_UNSPECIFIED', 'WINDOWS', 'LINUX', 'ANDROID', 'OSX', 'IOS', 'ANY_PLATFORM', ], "threatEntryTypes" => ["URL"], "threatEntries" => ['url' => $url], ] ]; $ch = curl_init(); $timeout = 10; curl_setopt($ch, CURLOPT_URL, $postUrl); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($ch, CURLOPT_REFERER, env('APP_URL')); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Connection: Keep-Alive' ]); $data = curl_exec($ch); $responseDecoded = json_decode($data, true); $responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($responseCode != 200) { return false; } $results_arr = json_decode($data); if (is_array($results_arr) && count($results_arr) > 0) { foreach ($results_arr->matches as $result) { if ($result->threat->url == $url) { return false; } } } } catch(Exception $e) { report($e); return false; } return true; } |
解説
上から順に解説していきます。
まずは、$postUrl
変数に格納しているURLのkey
パラメータの箇所、[GOOGLE_API_KEY]にGoogleで取得したAPIキーを記載します。
次に、$payload
変数の'threatInfo'
に配列で格納している箇所で、「脅威の種類」と「プラットフォームの種類」を設定します。
最後に設定したパラメータをcURLにセットしてAPIを叩けば、JSONで結果が帰ってきます。
脅威の種類
脅威の種類 | 説明 |
---|---|
THREAT_TYPE_UNSPECIFIED | 不明な脅威 |
MALWARE | マルウェアの脅威 |
SOCIAL_ENGINEERING | ソーシャルエンジニアリングの脅威 |
UNWANTED_SOFTWARE | 不要なソフトウェアの脅威 |
POTENTIALLY_HARMFUL_APPLICATION | 潜在的に有害なアプリケーションの脅威 |
サンプルコードではすべての脅威を検出するように設定しています。
プラットフォームの種類
プラットフォームの種類 | 説明 |
---|---|
PLATFORM_TYPE_UNSPECIFIED | 不明なプラットフォーム |
WINDOWS | Windowsへの脅威 |
LINUX | Linuxへの脅威 |
UNWANTED_SOFTWARE | 不要なソフトウェアの脅威 |
ANDROID | Androidへの脅威 |
OSX | OS Xにもたらされる脅威 |
IOS | iOSへの脅威 |
ANY_PLATFORM | 定義されたプラットフォームの少なくとも1つに脅威 |
ALL_PLATFORMS | 定義されたすべてのプラットフォームに脅威 |
CHROME | Chromeへの脅威 |
サンプルコードでは、すべてのプラットフォームに1つでの脅威を検出したらFalse
を返すようにしています。
【おまけ】Pythonサンプルコード
以下は、PythonでSafe Browsing APIを使用するための簡単なコード例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import urllib.request import json url = 'https://safebrowsing.googleapis.com/v4/threatMatches:find?key=YOUR_API_KEY' data = { "client": { "clientId": "yourcompanyname", "clientVersion": "1.5.2" }, "threatInfo": { "threatTypes": ["MALWARE", "SOCIAL_ENGINEERING"], "platformTypes": ["WINDOWS"], "threatEntryTypes": ["URL"], "threatEntries": [ {"url": "http://www.urltocheck1.org/"}, {"url": "http://www.urltocheck2.com/"} ] } } params = json.dumps(data).encode('utf8') req = urllib.request.Request(url, data=params, headers={'content-type': 'application/json'}) response = urllib.request.urlopen(req) response_data = json.loads(response.read()) |
この例では、APIキーを含むURLと、ウェブサイトのリストを検索するためのデータが定義されています。
リクエストが送信されたら、レスポンスを取得し、JSON形式のデータを解析して結果を取得します。
最後に
ちなみに、著者がよく利用しているPHPのフレームワーク「Laravel」のパッケージもあるようです。
パッと見た感じ、リンク先のWEBサイト安全なら遷移する、危険なサイトなら回避する、のような使い方ができそうですね。
コメント