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


safe-browsing-api

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

Googleの数あるAPIの中に「Cloud Vision API」があります。画像の内容を分析してくれるAPIなのですが、その1つにアダルトや暴力的な表現が含まれてる不適切な画像を検出してくれる機能もあります。今回はCloud Vision APIをPHPで利用する方法をご紹介します。Cloud V...
Cloud Vision APIとPHPを利用して不適切な画像を判断 - Minory

Safe Browsing APIの使い方

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

Google は2016年5月20日に Google Safe Browsing API version 4 を発表しました。 Google Online Security Blog: Evolvin
Google謹製クライアントでかんたんに使える!Google Safe Browsing API v4 のセッ... - 諸多日記
公式サイトの日本語版はなさそうですが、これまたGoogleの翻訳機能があれば問題ないでしょう。
The Safe Browsing APIs allow client applications to check URLs against Google's constantly updated lists of unsafe web resources.
Overview  |  Safe Browsing APIs (v4)  |  Google Deve... - Google Developers

サンプルコード

以下は、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」のパッケージもあるようです。

Laravel 5 package for the Google Safebrowsing API. Contribute to snipe/Safebrowsing development by creating an account on GitHub.
snipe/Safebrowsing - GitHub
パッと見た感じ、リンク先のWEBサイト安全なら遷移する、危険なサイトなら回避する、のような使い方ができそうですね。


コメント

このブログの人気の投稿

Linuxでファイルの改行コードLF⇔CRLFを変換する方法

RHEL 7でスタティック(静的)ルートを追加する4つの方法

SQLPlusでのOracleリモート接続とSQLファイルを実行する方法