PHP: verificare se un sito è stato aggiunto a Cloudflare

PHP: verificare se un sito è stato aggiunto a Cloudflare

In questo tutorial vedremo come verificare se un sito è stato aggiunto a Cloudflare usando PHP.

Un sito aggiunto a Cloudflare presenterà sempre i record NS di Cloudflare e opzionalmente l'header HTTP Server impostato sul valore cloudflare se è stata abilitata l'opzione Proxy.

Il primo passo è reperire gli header HTTP a partire da un dato URL. Possiamo creare la seguente classe.

class Request {
    private $url;

    public function __construct($url)
    {
        $this->url = $url;
    }

    public function send()
    {
        if(!filter_var($this->url, FILTER_VALIDATE_URL)) {
            return false;
        }

        return get_headers($this->url, true);
    }
}

Il parametro booleano della funzione core get_headers() indica in questo caso che l'output restituito sarà un array associativo.

Ora possiamo reperire i record NS del dominio da verificare.

class DNS {
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function resolve()
    {
        if(!filter_var('https://' . $this->host, FILTER_VALIDATE_URL)) {
            return false;
        }

        return dns_get_record($this->host, DNS_NS);
    }
}

La funzione core dns_get_record() restituisce un array associativo con i record NS del dominio o false in caso di errore nella query DNS.

Ora non ci resta che creare la classe principale che verifica che il dominio abbia i record NS di Cloudflare e opzionalmente l'header HTTP richiesto.

class Cloudflare {
    private $host;
    private $url;

    public function __construct($host)
    {
        $this->host = $host;
        $this->url = 'https://' . $this->host;
        $this->request = new Request($this->url);
        $this->dns = new DNS($this->host);
    }

    private function hasCloudflareNSRecords($records = [])
    {
        if(!is_array($records) || count($records) === 0) {
            return false;
        }
        $results = array_filter($records, function ($record) {
            return stristr($record['target'], 'ns.cloudflare.com') !== false;
        });

        return count($results) === 2;
    }

    private function hasCloudflareHTTPHeader($headers = [])
    {
        return is_array($headers) && array_key_exists('Server', $headers) && strtolower($headers['Server']) === 'cloudflare';
    }

    public function check()
    {
        $headers = $this->request->send();
        $records = $this->dns->resolve();

        return $this->hasCloudflareHTTPHeader($headers) || $this->hasCloudflareNSRecords($records);
    }
}

PHP, a differenza di JavaScript, non dispone di una funzione analoga al metodo Array.every()di JavaScript. Questo metodo JavaScript restituisce un valore booleano che indica se tutti gli elementi presenti nell'array hanno superato una comune verifica.

Poichè sappiamo che i record NS di Cloudflare sono due e presentano entrambi la medesima parte del loro valore (ns.cloudflare.com), possiamo usare la funzione core di PHP array_filter() e verificare che i record soddisfino tale requisito e che l'array risultante sia costituito esattamente da due elementi.

Possiamo usare la nostra classe nel modo seguente:

$cloudflare = new Cloudflare('gabrieleromanato.dev');
var_dump($cloudflare->check());
Torna su