• Авторизация


Хак для запрета использования Анонимных Прокси 09-05-2007 12:04 к комментариям - к полной версии - понравилось!


Может кому-то пригодится.

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


Код:


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


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 = preg_replace( "/
/" , "\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 .= "\n";
}
}

return <<

















Пожалуйста подождите



Данная операция займет не более 30 секунд и Ваши данные не будут утеряны



{$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= "\n";
$bad_proxy_detected=1;
$this->bad_proxy=1;
}
}
}
if ($show==1)
{
if ($bad_proxy_detected==0)
{
$hidden .= "\n";
}
echo $hidden . "
";
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( "", $skin_universal->error_log_in($QUERY_STRING), $html);
}
*/
//-----------------------------------------
// Do we have any post data to keepy?
//-----------------------------------------

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


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

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


FILE: /get_ip.php

Код:


//==============================================================================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, собственно как и поступает анонимный прокси - он выдает себя за клиента идущего на сайт БЕЗ ПРОКСИ СЕРВЕРА.

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


Вы сейчас не можете прокомментировать это сообщение.

Дневник Хак для запрета использования Анонимных Прокси | Eternity_Forever - Вечность.... Это для меня.... | Лента друзей Eternity_Forever / Полная версия Добавить в друзья Страницы: раньше»