Проверка на IP адрес в черни списъци (DNSBL) в PHP
Предговор
В Интернет има доста услуги за проверка на DNSBL (Черен списък на услугата за имена на домейни). Принципът им на работа - въвеждаме IP за проверка, натискаме бутона Проверка и след няколко секунди получаваме или списък с DNSBL мрежи с резултат за всяка, или просто отговор да-не.
Проверка на IP за черен списък чрез whoer.net
След като го тествах, веднага се заех с работата. Алгоритъмът е следният:
- заредете страницата, в заявката GET незабавно посочваме необходимия IP за проверка
- проверяваме дали сме получили изходния код на страницата или не, HTTP кода за отговор
- ние търсим част от HTML в изходния код, която казва дали присъства или не в DNSBL
- проверяваме според шаблона и връщаме резултата от работата.
URL адресът на заявката изглежда така:http://whoer.net/check?host=xxx.xxx.xxx.xxx
Където xxx.xxx.xxx.xxx е IP адресът за проверка.
Веднага тествах функцията file_get_contents - но в резултат получих код за отговор 403 (Забранено), тоест достъпът е отказан. Е, ясно е, че има някакъв вид защита срещу прости подобни заявки, защото с помощта на функцията file_get_contents зареждаме страница с името на клиентския браузър по подразбиране (PHP. ), което означава, че такива методи на whoer.net просто спират.
За да заредим страницата, имаме нужда от нещо по-мощно и правдоподобно, ще използваме могъщия CURL. Няма да се спирам подробно на възможностите на CURL, просто ще кажа, че с него можете да работите с HTTP, FTP, SFTP, SMTP, SSH и други протоколи.
Пишем функция за получаване на HTML кода на страницата с помощта на CURL и емулиране на различни браузъри. За да емулираме браузъри, ще използваме масив с няколко UserAgentStrings, като ги избираме на случаен принципоттам. Искам да отбележа, че можете да използвате моя клас за генериране на потребителски агенти, говорих за това в статията PHP клас - низ на потребителски агент.
Сега, за да получим изходния код на която и да е страница, трябва да извикаме функцията curl_get_page_html, като й дадем URL адреса. UserAgent може да бъде пропуснат, в който случай той ще бъде генериран от функцията get_random_useragent_strings.
Тук вземаме част от кода, който се намира в получения документ между редовете и и след това проверяваме дали тази част от кода съдържа подниза Yes, който показва наличието на проверения IP адрес в DNSBL черните списъци. Към момента (23-09-2014) оформлението на услугата съответства и функцията работи на 100%.
Пример за използване на всички функции:
Внимание, съжалявам. След няколко часа използване моите все още ранни предположения, че може да има ограничение на дневния брой заявки към услугата, се потвърдиха! Функцията започна да връща в своя резултат флага за грешка в заявката за услуга - масива array('error'=>1, 'inblack'=>0).
Ясно е, че 10-20 заявки на ден явно не са ми достатъчни за моите цели, трябва да търся друго решение.
PHP има тази функция: checkdnsrr - проверява DNS записа (A, MX, TXT. ) спрямо указаното име на хост или IP. Ще го използваме, за да управляваме нашия IP през услугите, като отправяме заявка за запис A към всяка от тях на свой ред. Такива заявки се поддържат от почти всички DNSBl директории, спомням си, че ги използвах в резачка за спам на UNIX сървър.
В този пример ще има две функции: първата ще върне масив с имената на DNSBL хостовете, спрямо които ще проверяваме, а втората ще провери спрямо получения списък с хостове.
Сега, за да проверим IP за присъствие в черните списъци на DNSBL, трябва да го направимизвикайте функцията dns_bl_check_ipaddress, като й предадете проверения IP като първи аргумент. резултатът от функцията ще бъде асоциативен масив от два елемента:
Ето пример за употреба:
Резултатът ще се покаже като текст:
Екстри за разработване и тестване на DNSBL
На този етап искам да говоря за някои от полезните неща, открити в процеса на тестване и разработка.
Най-доброто нещо е да тестваме нашите функции! Можете също така да изтеглите цялата база данни, има готови шаблони за htaccess файлове и защитни стени, като цяло може да ви бъде полезно.
2) Актуализирайте списък с DNSBL хостове и проверете с тях. Можете да заредите доста голям (колкото желаете) списък с DNSBL хостове в нашата функция за проверка (масивът във функцията get_dnsbl_hosts), но имайте предвид, че проверката може да отнеме много време. Следователно трябва да изберете най-живите и ефективни DNSBL за себе си и да работите с тях.
Заключение
Ето такава публикация по темата за програмиране и информационна сигурност, надявам се моят опит да бъде полезен и на други!
Тази сутрин някой от България спами блога ми с линкове и някакви политически глупости. За да намалите броя на подобни инциденти в блогове, можете да опитате да блокирате IP адресите, които са в DNSBL, ако сте много уморени!