Ну вот в данном случае ты определенно подходишь под свое же понятие "говнопрогер"
Ну давай начнем, я люблю разъёбывать зазнавшихся, да и тебе полезно будет - может рефакторинг сделаешь
0. Твой стиль форматирования кода, а точнее его полное отсутствие - знакомо мне ещё с недодоргена, который я имел неосторожность купить.
Если ты будешь отмахиваться, что убираешь форматирование только перед тем как выкладываешь - то ты явно не уважаешь тех,
кто у тебя покупает/качает скрипты. Обфусцируй нахуй тогда вообще всё и засунь под ионкуб )
Ну а лучше почитай хотя бы
PSR-2.
1.
Код:
$ptr = gethostbyaddr($ip); // получаем ptr хост по ip
$ip2 = gethostbynamel($ptr); // массив ip принадлежащих хосту
На каждый ебаный запрос - ты дёргаешь DNS, а это значит что при нагрузке они усрут весь канал в хлам,
тем более что ответы от DNS-серверов зачастую не такие быстрые как хотелось бы (если не юзать кастомные DNS сервера вроде гугловых или cf, но кто ж это настраивает на серваке?!).
Кешировать надо это говно или хотя бы named иметь правильно настроенный.
2.
Можно задать булевый тип и не нужно будет потом извращаться с условиями аля "$test_ptr == 1" - ты
очень любишь зачем-то такие сравнение везде по коду херачить. Как будто для тебя получение булевой true/false - недостаточно)
3.
Код:
stripos($ptr, $ptr_line, 0)
Последний аргумент необязательный и по дефолту и так равен 0.
И самое смешное и важное: если я себе задам PTR запись у IP адреса вида: "123.123.123.123.googlebot.com.my-domain.com" и
зайду под юзерагентом, содержащим "Googlebot", то у твоя клоака пропустит меня и не сработает)) Отличный вариант для того, чтоб устроить DDoS конкуренту)
4.
Код:
if (in_array($ip, $ip2) AND $test_ptr == 1) {return 1;} else {return 0;}
Зачем городить такие условия, чтоб вернуть единицу (истину в данном случае), если условие истинно?
Горазд проще засунуть тело условия в return и не париться - там результат будет тот же самый, а читаемость кода повысится в разы
5.
Код:
filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)
Забавно что ты знаешь о filter_var, но не слышал о filter_input, который как раз и нужен для такого рода кода,
чтоб не использовать суперглобальные массивы
6.
Код:
$_SERVER['REMOTE_ADDR']
У тебя в куче мест в коде именно эта строка принимается за истинный IP-адрес пользователя, но это вообще ни разу не корректное решение.
Нужно по очереди проверять заголовки 'HTTP_CF_CONNECTING_IP', 'HTTP_TRUE_CLIENT_IP', 'HTTP_X_REAL_IP', 'HTTP_FORWARDED' и ещё пяток других, а уже в самом конце смотреть 'REMOTE_ADDR'.
Вот хорошая отправная точка по этому вопросу (но решение не идеальное):
https://stackoverflow.com/questions/...ress-using-php
Я предпочитаю не городить кучу условий, а перебирать эти заголовки в foreach-цикле и вываливаться из него, когда получили первый не пустой валидный адрес.
7.
Код:
foreach ($ab_proxy as $proxy_mask => $proxy_attr) {
$net = $proxy_mask;
$ip=ip2long($_SERVER['REMOTE_ADDR']);
Зачем ты в цикле каждый раз делаешь одно и тоже? Третья строчка (и следующие, которые связаны с ней - необходимо
вынести из цикла, а то ты стопицот раз будешь преобразовывать IP-адрес в целочисленный вид
8. Да и вообще весь цикл, что описан выше - скорее всего не имеет смысла, если нормально реализовать получение реального IP-адреса юзера.
И вообщем там по коду кучу таких хитровыебанных моментов есть, которые обычно только с опытом осознаешь
Но можно, конечно, да - ебашить просто по мануалам код, это ж PHP - нахуй тут думать?) Работает вроде в 8 из 10 случаев?
Ну и заебись) А если ещё и отображение ошибок отключить, так вообще ляпота