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

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


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

Задача - есть юзер, который выходил с одного 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, ты бы лучше в Архиве выложил.

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

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

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

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

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

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

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

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

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

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