Ars Longa, Vita Brevis

Май 2, 2008

Forward Confirmed reverse DNS, или, Зомби не пройдут

Рубрика: Linux, PHP, security
Метки: , , ,
Vladimir @ 8:15 пп
RSS 2.0

Простая реализация проверки Forward Confirmed reverse DNS

FCrDNS, или Forward Confirmed Reverse DNS, это когда IP-адрес имеет прямую (имя -> IP) и обратную (IP -> имя) DNS-записи, которые, к тому же, соответствуют друг другу.

Сначала выполняется обратный DNS-запрос для получения списка PTR-записей (обычно возвращается только одна запись, но это не всегда так). Затем для каждого доменного имени, указанного в PTR-записях, выполняется обычный (прямой) DNS-запрос с целью проверки, что существует запись A или AAAA, совпадающая с исходным IP-адресом. Если это так, то проверка считается пройденной.

Проверка FCrDNS может считаться слабой формой аутентификации, устанавливающей, что есть действительная связь между владельцем доменного имени и владельцем сети, получившим данный IP-адрес. Хотя такая аутентификация и слаба, она достаточно хороша, для того, чтобы отсеивать спамеров и иже с ними, использующих компьютеры-зобми для подделки доменов.

Перевод Forward Confirmed reverse DNS.

А теперь о практической реализации.

[-]
View Code PHP
<?php
    $ip  = 'IP ADDRESS HERE';
    $rev = preg_replace('/^(\\d+)\.(\\d+)\.(\\d+)\.(\\d+)$/', '$4.$3.$2.$1', $ip);

    $authns = array();
    $add    = array();

    $ptrs = @dns_get_record("{$rev}.IN-ADDR.ARPA.", DNS_PTR, $authns, $add);
    if (true == empty($ptrs)) {
        die('NXDOMAIN');
    }

    foreach ($ptrs as $x) {
        if (true == isset($x['target'])) {
            $target = $x['target'];
            $a      = @dns_get_record($target, DNS_A, $authns, $add);
            if (true == is_array($a)) {
                foreach ($a as $y) {
                    if (true == isset($y['ip'])) {
                        if ($ip == $y['ip']) {
                            die("FCrDNS check OK");
                        }
                    }
      &