サイトの安全性を確かめるSafe Browsing APIをPHPで試す

safe-browsing-api
  • URLをコピーしました!

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 ConsoleAPIキーを取得する必要があります。
APIキーを取得したら、APIを使用するためのクライアントライブラリを選択し、APIリクエストを送信することができます。
クライアントライブラリは、Java、Python、PHP、Ruby、.NET、Go、Node.jsなどのプログラミング言語で使用することができます。

以下の参考サイトには、Google APIの利用登録方法から、簡単な使い方まで掲載されていますので、もし登録がお済みでない方はぜひご覧ください。

公式サイトの日本語版はなさそうですが、これまたGoogleの翻訳機能があれば問題ないでしょう。

PHPサンプルコード

以下は、WEBサイトが不適切でないか判断をする関数を作成したものです。

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変数に格納しているURLkeyパラメータの箇所、[GOOGLE_API_KEY]Googleで取得したAPIキーを記載します。
次に、$payload変数の'threatInfo'に配列で格納している箇所で、「脅威の種類」と「プラットフォームの種類」を設定します。
最後に設定したパラメータをcURLにセットしてAPIを叩けば、JSONで結果が帰ってきます。

脅威の種類

スクロールできます
脅威の種類説明
THREAT_TYPE_UNSPECIFIED不明な脅威
MALWAREマルウェアの脅威
SOCIAL_ENGINEERINGソーシャルエンジニアリングの脅威
UNWANTED_SOFTWARE不要なソフトウェアの脅威
POTENTIALLY_HARMFUL_APPLICATION潜在的に有害なアプリケーションの脅威
引用:ThreatType | Safe Browsing APIs (v4) | Google Developers

サンプルコードではすべての脅威を検出するように設定しています。

プラットフォームの種類

スクロールできます
プラットフォームの種類説明
PLATFORM_TYPE_UNSPECIFIED不明なプラットフォーム
WINDOWSWindowsへの脅威
LINUXLinuxへの脅威
UNWANTED_SOFTWARE不要なソフトウェアの脅威
ANDROIDAndroidへの脅威
OSXOS Xにもたらされる脅威
IOSiOSへの脅威
ANY_PLATFORM定義されたプラットフォームの少なくとも1つに脅威
ALL_PLATFORMS定義されたすべてのプラットフォームに脅威
CHROMEChromeへの脅威
引用:PlatformType | Safe Browsing APIs (v4) | Google Developers

サンプルコードでは、すべてのプラットフォームに1つでの脅威を検出したらFalseを返すようにしています。

【おまけ】Pythonサンプルコード

以下は、PythonSafe Browsing APIを使用するための簡単なコード例です。

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サイト安全なら遷移する、危険なサイトなら回避する、のような使い方ができそうですね。

著:清水 亮, 著:枡田 健吾, 著:近江 幸吉, 著:佐藤 香奈, 著:一政 汐里
¥1,161 (2025/08/11 12:32時点 | Amazon調べ)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次