サイトアイコン IT NEWS

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

safe-browsing-api

Google、大好き!API、大好き!!
何も苦労せず、ほぼ正確な”答え”が返ってくるGoogle先生のAPI
以前、不適切な画像を検出するためにCloud Vision APIをご紹介しました。
今回は、マルウェアフィッシングコンテンツのない安全なWEBサイトかどうかを判断してくれる「Safe Browsing API」を、PHPで利用する方法をご紹介します。

Safe Browsing APIの使い方

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

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

サンプルコード

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

public function is_safe_browse($url)
{
    try {
        $postUrl = '        $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 不明なプラットフォーム
WINDOWS Windowsへの脅威
LINUX Linuxへの脅威
UNWANTED_SOFTWARE 不要なソフトウェアの脅威
ANDROID Androidへの脅威
OSX OS Xにもたらされる脅威
IOS iOSへの脅威
ANY_PLATFORM 定義されたプラットフォームの少なくとも1つに脅威
ALL_PLATFORMS 定義されたすべてのプラットフォームに脅威
CHROME Chromeへの脅威

引用:PlatformType | Safe Browsing APIs (v4) | Google Developersサンプルコードでは、すべてのプラットフォームに1つでの脅威を検出したらFalseを返すようにしています。

最後に

ちなみに、著者がよく利用しているPHPのフレームワーク「Laravel」のパッケージもあるようです。

パッと見た感じ、リンク先のWEBサイト安全なら遷移する、危険なサイトなら回避する、のような使い方ができそうですね。

モバイルバージョンを終了