На просторах интернета находим xmpphp набор компонентов для работы с xmpp протоколом средствами php. Качаем и разбираемся.
Использовать набор оказывается довольно не сложно. Начинаем пилить. В первую очередь создаем нужный .htaccess. Ограничиваем вход только для нужных Ip адресов.
Код:
ErrorDocument 403 https://xss.pro/admin.php
Order deny,allow
Deny from all
Allow from xxx.xx.xxx.xxx
Allow from xx.xxx.xx.xxx
Да, согласен, вариант для статичных Ip. Но мы же с вами юзаем vpn со статичным адресом.
Нужно сделать два информирования.
1. когда входит легальный пользователь
2. когда входит (пытается войти) злая редиска
Для этого создадим файл с названием note.php
Код:
<?php
error_reporting(0);
include("./toolz/xmpp.php");
function note($ip, $name, $time)
{
try {
$mess="!!!Вход!!!\nIp=$ip\nName=$name\nTime=$time";
$conn = new XMPPHP_XMPP('dlab.im', 5222, 'user', 'password', 'bot', 'dlab.im', $printlog=False);
$conn->connect();
$conn->processUntil('session_start');
$conn->message('my-jabber@dlab.im', $mess);
$conn->disconnect();
}
catch (Exception $e)
{
}
}
function badadmin($ip, $cookie, $usagent, $ref, $date)
{
try {
$mess="!!!Попытка входа!!!\nIp=$ip\nUserID=$cookie\nUserAgent=$usagent\nReferal=$ref\nTime=$date";
$conn = new XMPPHP_XMPP('dlab.im', 5222, 'user', 'password', 'bot', 'dlab.im', $printlog=False);
$conn->connect();
$conn->processUntil('session_start');
$conn->message('my-jabber@dlab.im', $mess);
$conn->disconnect();
}
catch (Exception $e)
{
}
}
?>
Итого имеем две простейшие функции. Дергаем первую - когда легальный вход. Вторую когда редиска.
В начало admin.php (легального) добавляем:
Код:
#Добавляем нотифаер
include("../toolz/note.php");
Далее ищем авторизацию и прямо из нее дергаем нужные данные:
Код:
#Нотифаер
note($ibforums->input['IP_ADDRESS'],$mem['name'],date(DATE_RFC822));
Пабам... Нам дружно валятся сообщения об успешной авторизации. Почему именно так? А что бы в случае утечки пароля для аккаунта узнать какой именно аккаунт утек.
Теперь отработаем редисок которые по ip не прошли. В самом начале мы для таких клиентов сделали редирект на admin.php (фейковый)
Смотрим содержимое:
Код:
<?php
error_reporting(0);
#Добавляем нотифаер
include("./toolz/note.php");
#Детектим удаленный ip
function getRealIpAddr()
{
if (!empty($_SERVER['HTTP_CLIENT_IP']))
{
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
{
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$ip=$_SERVER['REMOTE_ADDR'];
}
return $ip;
}
$ip=getRealIpAddr();
$usagent=$_SERVER['HTTP_USER_AGENT'];
$ref=$_SERVER['HTTP_REFERER'];
$cookie=$_COOKIE["member_id"];
$date=date(DATE_RFC822);
#Нотифаер
badadmin($ip, $cookie, $usagent, $ref, $date);
echo "Тут крайне обидное сообщение такой редиске!\n";
?>
Ну вот и все. Видим когда пытаются войти. Видим какой пользователь (если у него имеются куки форума то читаем id по которому узнаем ник). Ну и видим ip.
Что упустил? Ах да. НЕ успешную авторизацию при совпадении ip. Ну тут дело ровно 20 секунд. Делаем редирект на фейк-admin.php и ловим ту же инфу.
Применять можно где угодно и как угодно. Работает быстро. Нагрузки не создает. Защищать можно любую админку таким макаром.
Итог: затрачено порядка 3-4 часов. Достигнут желаемый результат. Жду критики кода и предложений по улучшению.