Перейти к контенту

Как боротся с анонимными прокси?


Рекомендуемые сообщения

Задача - есть юзер, который выходил с одного IP (сразу видно, выделенка дома).

 

Затем его забанили по IP. Так он теперь ходит через анонимки... Как быть?

 

Предлагать забанить его по е-мейлу - тоже не надо.

 

BTW, есть большущая база бесплатных е-мейлов - можно отсекать халявный е-мейл, не проблема... Но как же быть то с IP ?

Ссылка на комментарий
Поделиться на других сайтах

AlexXF вопрос стар как мир, и ответа на него пока не нашли.

Наиболее действенно, это найти списки прокси, есть такие в сети, и внести их в список бана. Но этот список надо постоянно, раз, а то и два, обновлять. Хотя 100% результат не гарантируется.

Ссылка на комментарий
Поделиться на других сайтах

Однако есть идеи по этому поводу:

 

1. Делать обратный кольцевой запрос при логине пользователя на этот IP адрес с запросом собственного скрипта. Если он срабатывает как прокся, причем отбивающая IP адрес, то пользователя в бан без вопросов.

 

2. Делать лог по его странам. Если вдруг у пользователя в течении суток-двух страна меняется два-три раза, то автоматом бан.

 

Вот такие мысли... кто предложит чего нового?

Ссылка на комментарий
Поделиться на других сайтах

Итак... вопрос решен, хак написан.

 

Единственный его минус - тормозит секунд 30 при первом вхождении...

 

Куда заливать и что мне за это будет? :D

Ссылка на комментарий
Поделиться на других сайтах

Я думаю что кроме протирания пирожка с полки ты мало чего получишь :D
Ссылка на комментарий
Поделиться на других сайтах

ну чтож... держите!

 

Хак для запрета использования Анонимных Прокси

Заливаем на сайт к себе в корень такой файл:
/get_ip.php

<?
       global $_SERVER;
       $ip = $_SERVER["REMOTE_ADDR"];
       if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
 echo "IP_ADDRESS_CLIENT:" . $ip . ":";
?>

//==============================================================================



FILE: /sources/functions.php

добавляем в конец файла:

//==============================================================================
class test_proxy
{

var $bad_proxy=0;
   //-------------------------------------------
   // Check User IP for anonymous proxy
   //-------------------------------------------
   function clean_value_back($val) {

   	if ($val == "")
   	{
     return "";
   	}

   	$val = str_replace( " ", " ", $val );
   	$val = str_replace( """      ,"\""         , $val );

   	$val = str_replace( "<!--" , "<!--"     , $val );
   	$val = str_replace( "-->"      ,"-->"        , $val );
   	$val = preg_replace( "/<br>/"        , "\n"          , $val ); // Convert literal newlines
   	$val = preg_replace( "/$/"      , "\\$"         , $val );
   	$val = str_replace( "!"        ,"!"          , $val );
   	$val = str_replace( "'"            ,"'"          , $val ); // IMPORTANT: It helps to increase sql query safety.
   	$val = str_replace( "&"        , "&"         , $val );

   	return $val;
   }

   function generate_redirect_page()
   {
   	global $ibforums;

       $arr=$ibforums->input;
       $hidden="";
       foreach($arr as $key=>$value)
       {
       	if (strtoupper($key) != 'IP_ADDRESS' &&
           	strtoupper($key) != 'REQUEST_METHOD' &&
           	strtoupper($key) != 'PRIVACY' &&
           	strtoupper($key) != 'LAST_ACTIVITY' &&
           	strtoupper($key) != 'LAST_VISIT')
           {
           	$hidden .= "<INPUT TYPE=hidden name='$key' value='" . $this->clean_value_back($value) ."'>\n";
           }
       }

return <<<EOF
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

<style type='text/css'>
.tablefill   { border:1px solid #345487;background-color:#F5F9FD;padding:6px; font-family: Tahoma; font-size: 8pt; color: #000000  }
</style>
</head>

<body bgcolor="#FFFFFF" text="#000000" OnLoad="document.hideform.submit();">
<table width='100%' height='85%' align='center'>
<tr>
 <td valign='middle'>
  <table align='center' cellpadding="4" class="tablefill">
  <tr>
   <td width="100%" align="center" nowrap> Пожалуйста подождите<br>
           <br>
           Данная операция займет не более 30 секунд и Ваши данные не будут утеряны</td>
  </tr>
</table>
 </td>
</tr>
</table>
<form name="hideform" method="post" action="/index.php">
 {$hidden}
EOF;
   }

 

Тут я прервусь на немного...

 

Обратите внимание на то, куда постится форма - Это ВАЖНО!. Если Ваш сервер установлен в какой то поддиректории например - /IPBFORUM/index.php, то естественно надо URL поменять... Можно было сделать красивее - через VARS, но я не стал...

 

    function check_ip_by_port($ip, $port)
   {
       set_time_limit(0);
       error_reporting (0);
       $errno="";
       $errstr="";

       $fp = fsockopen($ip, $port, $errno, $errstr, 1);
       if (!$fp)
       {
           return 0;
       }

       $server = $_SERVER["SERVER_NAME"];
       //$server = $_SERVER["SERVER_ADDR"];
 $url = "http://" . $server .  "/get_ip.php";  // заранее написаный скрипт, который скажет нам IP возврата
 $in_str="";
 fputs($fp, "GET $url HTTP/1.1\r\nHost: $server\r\n\r\n");
 while(!feof($fp)){
 	$line = fgets($fp, 4000);
 	$in_str .= $line;
 }
 fclose($fp);

       if (preg_match("/IP_ADDRESS_CLIENT:(.*):/", $in_str, $regs))
       {

           if ($_SERVER["SERVER_ADDR"] != $regs[1])
           {
               return 1;
           }
       }
       return 0;

   }

    function check_anonymous_proxy($show=0)
   {
   	// Порты для проверки 80,8080,3128

       global $_SERVER, $sess;
       $ip = $_SERVER["REMOTE_ADDR"];
       if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];

       if ($show==1)
       {
           echo $this->generate_redirect_page();
       	flush();
       }

       // test:
       //$ip = "smtpmail.loginsoft.com";
       flush();
 $port_array = array ( 0 => 80,
              1 => 8080,
                             2 => 3128, );

       $hidden="";
       $bad_proxy_detected=0;
       foreach($port_array as $key=>$value)
       {
           if ($bad_proxy_detected==0)
           {
           	if ($this->check_ip_by_port($ip, $value) == 1)
           	{
             $hidden= "<INPUT TYPE=hidden name='BAD_PROXY' value='YES'>\n";
               	$bad_proxy_detected=1;
                   $this->bad_proxy=1;
           	}
           }
       }
       if ($show==1)
       {
       	if ($bad_proxy_detected==0)
           {
           	$hidden .= "<INPUT TYPE=hidden name='s' value='" . $sess->session_id . "'>\n";
           }
       	echo $hidden . "</form></body></html>";
           die();
       }

       return $bad_proxy_detected;
   }
}
//================================================================================


в класс session добавляем функцию:
//================================================================================

   function check_proxy()
   {
       global $ibforums;

       // вот здесь должна быть проверка на анонимность прокси!!!
       if ($ibforums->input['BAD_PROXY']=='YES')
       {
               $this->unload_member();
               $this->session_id=0;
               return 1;
       }else{
           if ($ibforums->input['act'] != 'Login')
           {
           	global $proxy_check;

         if ($proxy_check->check_anonymous_proxy(1)==1)
         {
               	$this->unload_member();
               	$this->session_id=0;
                   return 1;
           }
           }
       }
       return 0;
       /////////////////////////////////////////////////////////
   }
//================================================================================

Находим в функцию create_member_session() в классе session

в самом ее конце вставляетя:

 	// ---------- начало вставки
           $this->check_proxy(1);
           // ---------- конец вставки
 }
 else
 {
 	$this->create_guest_session();
 }
//================================================================================

то же самое и с функцией create_guest_session()
В самый конец функции добавляется:

 	// ---------- начало вставки
           $this->check_proxy(0);
           // ---------- конец вставки

//================================================================================

Функция класса session authorize()

Ищем:
 //-------------------------------------------------
 // Do we have a valid session ID?
 //-------------------------------------------------

сразу же после этого добавляем:

       if ($ibforums->input['BAD_PROXY'] == 'YES')
       {
           $this->unload_member();
       }
//================================================================================
//================================================================================
//================================================================================

Файл : /sources/Login.php

   function do_log_in() {
       // ----------- изменено
       global $proxy_check, $DB, $ibforums, $std, $print, $sess, $HTTP_USER_AGENT, $HTTP_POST_VARS;
       // ----------- изменено

   	$url = "";

       // ------------ добавлено
       if ($proxy_check->check_anonymous_proxy(0)==1)
       {
 	$DB->query("UPDATE ibf_sessions SET ".
         "member_name='',".
         "member_id='0',".
         "login_type='0' ".
         "WHERE id='". $sess->session_id ."'");

           $sess->session_id=0;
 	$std->my_setcookie( "member_id" , "0"  );
 	$std->my_setcookie( "pass_hash" , "0"  );
 	$std->my_setcookie( "anonlogin" , "-1" );
           $sess->unload_member();
           $ibforums->input['s']="";
           $ibforums->session_id=0;
       	$std->Error( array( 'LEVEL' => 1, 'MSG' => 'poss_hack_attempt') );
       }
       // ------------ добавлено

//================================================================================
//================================================================================
//================================================================================

файл : /index.php

$std   = new FUNC;
$print = new display();
$sess  = new session();
   // ----------- добавлено
$proxy_check = new test_proxy;
   // ---------------------

   ...
   ...
   ...

   // ----------- добавлено
if ($ibforums->input['BAD_PROXY']=='YES' || $proxy_check->bad_proxy==1)
{
 $std->Error( array( 'LEVEL' => 1, 'MSG' => 'poss_hack_attempt') );
}
// ---------------------

//--------------------------------

if ($ibforums->input['act'] != 'Login' and $ibforums->input['act'] != 'Reg' and $ibforums->input['act'] != 'Attach')
{

//--------------------------------
//  Do we have permission to view
//  the board?
//--------------------------------

//================================================================================
//================================================================================
//================================================================================

Если мы уж хотим полностью закрыть доступ анонимным проксям, то тогда делаем так:

Файл: /sources/functions.php

находим и комментируем следующее:

   	//-----------------------------------------
   	// If we're a guest, show the log in box..
   	//-----------------------------------------
       /*
   	if ($ibforums->member['id'] == "" and $error['MSG'] != 'server_too_busy' and $error['MSG'] != 'account_susp')
   	{
     $html = str_replace( "<!--IBF.LOG_IN_TABLE-->", $skin_universal->error_log_in($QUERY_STRING), $html);
   	}
       */
   	//-----------------------------------------
   	// Do we have any post data to keepy?
   	//-----------------------------------------


ВСЕ! Кроме сообщения об ошибке, человек пришедший из-за искажающей или анонимной прокси ничего не увидит

 

 

В принципе на этот код может наворачиваться что угодно, но основное решение такое.

Единственным минусом такого кода может быть только то, что если у клиента установлен некий Web сервер на компьютере, то он будет так же опрашиваться...

 

Как ускорить проверку? Если же нас интересуют только АНОНИМНЫЕ прокси, а не ИСКАЖАЮЩИЕ, то надо изменить:

 

FILE: /get_ip.php

<?
       global $_SERVER;
       $ip = $_SERVER["REMOTE_ADDR"];

       // Убираем проверку на HTTP_X_FORWARDEF_FOR
       // if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
 echo "IP_ADDRESS_CLIENT:" . $ip . ":";
?>

//==============================================================================
FILE: /sources/functions.php

    function check_anonymous_proxy($show=0)
   {
       // Порты для проверки 80,8080,3128

       global $_SERVER, $sess;
       $ip = $_SERVER["REMOTE_ADDR"];
       if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) return 0; //$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];

 

при таком изменении мы анализируем только адрес для Direct Connection, собственно как и поступает анонимный прокси - он выдает себя за клиента идущего на сайт БЕЗ ПРОКСИ СЕРВЕРА.

 

Уфф.... Надеюсь это поможет :D

 

P.S. Мой пирожок с полки где?

 

Добавлено:

Дополнение

 

Для теста можно использовать анонимный прокси: smtpmail.loginsoft.com:80

Ссылка на комментарий
Поделиться на других сайтах

  • 8 месяцев спустя...

юным invisonсам:

если вы понимаете сколько процентов аудитории отрубаете вместе с анонимными проксями то хак вам не нужен

Ссылка на комментарий
Поделиться на других сайтах

>если вы понимаете сколько процентов аудитории отрубаете вместе с анонимными проксями то хак вам не нужен

 

Интересно, какая польза может быть с юзеров с публичных прокси? Если же у тебя в нормальной организации или подсетке стоит открытый прокси... Ну, извини. Это твои проблемы. Кстати, открытые прокси даже во многие почтовые блеклисты вносятся. Появится у тебя открытый прокси на машине - и прощай скоро почта на Рамблер, например. Не знаю как сейчас, но в прошлом году Yandex даже заходить к себе с анонимных прокси не позволял.

 

Наверное - всё "юные invisoncы" :D

Ссылка на комментарий
Поделиться на других сайтах

  • 3 месяца спустя...
но в прошлом году Yandex даже заходить к себе с анонимных прокси не позволял.

И счас тоже запрещает. Да и не только он, а полно админов которые запретили прокси и правильно сделали.

 

А вообще вещь нужная, потомучто я уже не могу выносить как один урод каждый раз меняет прокси, мыло и ник и заходит ко мне на форум, а потом втирается опять в доверие, и когда добивается свуоего подставляет меня. Так что без того чтобы поставить запрет на прокси никак. Это может быть ненужным только тем людям, у которых список забаненых пуст.

Ссылка на комментарий
Поделиться на других сайтах

  • 6 месяцев спустя...

Такой вопрос возник по этой модификации:

 

- Как сделать проверку на прокси только при регистрации?

 

(Чтобы каждый раз 30 секунд никто не терял,

а только единожды - при попытке зарегистрироваться.)

Ссылка на комментарий
Поделиться на других сайтах

  • 10 месяцев спустя...
Автор, а о какой версии IPB идет речь)))?

Посмотрел код, по-быстрому.

 

Похоже пойдёт для 1х-2.0.х, возможно что-то чуть придётся подправить.

 

2Автор мода. Пирожок с полки пока, что на полке. Никто не собирается искать реквизиты -)

Ссылка на комментарий
Поделиться на других сайтах

  • 3 недели спустя...
  • 4 месяца спустя...
Задача - есть юзер, который выходил с одного IP (сразу видно, выделенка дома).

 

Затем его забанили по IP. Так он теперь ходит через анонимки... Как быть?

 

Предлагать забанить его по е-мейлу - тоже не надо.

 

BTW, есть большущая база бесплатных е-мейлов - можно отсекать халявный е-мейл, не проблема... Но как же быть то с IP ?

Кстати, javascript позволяет получить текущий IP (не проксевый)?

Ссылка на комментарий
Поделиться на других сайтах

  • 3 недели спустя...

Предлагаю не давать сессию прокси ваще ... Экономия времени и места, а так же открытость нарушителей ;)

А как это сделать?

 

Если используется прокся, то вход под пользователем невозможен :D (шлём его куда по дальше)

Ссылка на комментарий
Поделиться на других сайтах

Грамотно настроенный проксик (анонимный) такой мод не возьмёт, я больше склоняюсь к использованию проверке по отпечатку системы пользователя. Проверку можно сделать очень гибкую и намного лучше защитит, чем проверку на прокси, что сделать практически нереально. Вот только такая система денег стоит и немаленьких :D
Ссылка на комментарий
Поделиться на других сайтах

я больше склоняюсь к использованию проверке по отпечатку системы пользователя.

А если пользователь захочет зайти на форум с работы, из клуба и тд.???

Ссылка на комментарий
Поделиться на других сайтах

Процитировал бы всё, нашёл бы и ответ :)

Проверку можно сделать очень гибкую.

Никто не запрещает добавить несколько отпечатков на аккаунт, с клубами всё сложнее, как вариант, можно сделать спец флэшку с ключём и по ней проверку делать. Это реально, но я таким не занимался, т.к. все посетители моего форума клубам не доверяют, как и я :D

 

ЗЫ: вот подумал, может попрактиковать с флешкой малёк, мб что-то интересное получится ;)

Ссылка на комментарий
Поделиться на других сайтах

  • 10 месяцев спустя...

AlexXF, ты бы лучше в Архиве выложил.

Многие проходят форумы и темы стороной. И видят только то, что есть в архиве.

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.