Скрипт запрета/бана доступа по ip
на php
с админкой, автоматической сортировкой и убиранием дублей. Обеспечивает удобный способ закрытия доступа без обращения к .htaccess
.
Админка дублируется во всплывающем окне, что очень удобно при анализе лог-файлов и внесения определенных к бану ip
в список.
Характеристики:
- удобство пользования
- единственная точка входа в скрипт (исключено прямое обращение к файлу админки)
- простота и легкость настройки/использования
- автоматическая сортировка и убирание дублей
Описание и пример использования:
Скрипт состоит из 5 файлов и одного служебного:
login_ban.php
— файл входа в админкуcheck.php
— файл проверки имени и пароля админкиadmban.php
— админка с обработчикомban_include.php
— подключаемый файл для бана страницы/сайтаipban.dat
— файл хранения забаненых ipfor_del_md5.php
— служебный файл получения хэшей по md5 – подлежит удалению после получения нужных значений
- Файл входа в админку
login_ban.php
:
<?php
//единственная точка входа через форму
header('Content-Type: text/html; charset=utf-8');
echo '
<form action="check.php" method="post" name="banip">
Имя:<br />
<input type="text" name="name" id="name"><br />
Пароль:<br />
<input type="password" name="password" id="password"><br />
<input type="submit" value="Отправить" style="margin-top:10px;" >
</form>
';
?>
- Файл проверки имени и пароля админки
check.php
:
<?php
/***********************************************
/* Denying access for ip trough php script - © «OIS» aka Coder (http://coder.hol.es)
/* This notice MUST stay intact for legal use
/* Visit http://coder.hol.es/ for this script and others.
***********************************************/
header('Content-Type: text/html; charset=utf-8');
//проверочный файл для доступа к админпанели управления забанеными
session_start();//начинаем сессию - без нее - никуда
$test_var = 'fe69dc4b3a73879749adf63844a36033';//проверочная переменная для блокировки прямого доступа к файлам скрипта
$adm_name = '098f6bcd4621d373cade4e832627b4f6';
$adm_pass = '098f6bcd4621d373cade4e832627b4f6';
$name = trim(strip_tags($_POST['name']));
$password = trim(strip_tags($_POST['password']));
if (md5($password) !== $adm_pass)
{
die ('Пароль не верен<br />');
}
elseif(md5($name) !== $adm_name)
{
die ("Имя не верно");
}
else {
$_SESSION['test_var'] = $test_var; //устанавливаем проверочную переменную
$URL="admban.php";// переход в админпанель
header("Location:$URL");
die;
}
?>
- Файл админки с обработчиком
admban.php
:
<?php /*********************************************** /* Denying access for ip trough php script – © «OIS» aka Coder (http://coder.hol.es) /* This notice MUST stay intact for legal use /* Visit http://coder.hol.es/ for this script and others. ***********************************************/ header('Content-Type: text/html; charset=utf-8'); session_start();//продолжаем сессию и получаем проверочную переменную if (!isset ($_SESSION['test_var']) or (md5('test_var') !== ($_SESSION['test_var']))) { die ("403 Forbidden");//если проверочной переменной нет (а она устанавливается при проверке) или она не совпадает, то out } $ip_file = file("ipban.dat");//получаем содержимое файла забаненых в массив sort($ip_file);//сортируем по возрастанию $ip_file = array_unique($ip_file);// убираем дубли $ip_count = count($ip_file);//считаем общее колво забаненых if ($_SERVER['REQUEST_METHOD'] == 'POST') {//если способ запроса был пост (а не GET), то вперед if (file_exists("ipban.dat")) {//а вдруг файла нет? $ipbaned = array(trim(strip_tags($_POST['ipbaned'])));//на всякий пожарный обрезаем по бокам и удаляем теги в полученном из формы и преобразовываем в массив $ip_adr = fopen("ipban.dat","w");//открываем flock($ip_adr,LOCK_EX);//блокируем для этой операции foreach($ipbaned as $value) { fputs($ip_adr, $value."\n");//записываем } fflush($ip_adr);//очищаем буфер вывода flock($ip_adr,LOCK_UN);//разблокируем fclose($ip_adr);//закрываем } else { echo "Файл отсутствует.";//если файла-то нет exit; } //после всего презапрашиваем сервер по GET для отображения изменений в панели и нормальной работы вообще :) header("Location:{$_SERVER['PHP_SELF']}"); exit();//закончили вообще // … } ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Админ сайта <?=$_SERVER["SERVER_NAME"]?> для бана ip</title>
<!-- подключаем js функцию для вывода во всплывающих окнах //-->
<script language=JavaScript><!--
function pop_voice() {pop=window.open('','voice','width=250,height=350,left=250,top=100'); pop.focus();}
//-->
</script>
</head>
<body>
<form action="<?=$_SERVER['PHP_SELF']?>" method="post" target='voice'>
<p><b>Один ip на строку (сайт -> <?=$_SERVER["SERVER_NAME"]?>)</b></p>
<textarea name="ipbaned" rows="7" id="ipbaned" cols="15" ><?php
foreach($ip_file as $value) {
echo $value;
}
?></textarea><br />
<input type="submit" value="Сохранить" style="margin-top:10px;" onClick='pop_voice();' >
</form>
Всего забанено: <?=$ip_count?>
</body>
</html>
- Подключаемый файл для бана страницы/сайта
ban_include.php
:
<?php
//подключаемый файл для нужных страниц с проверкой ip и нахождения в базе(файле)
header('Content-Type: text/html; charset=utf-8');
$ip = $_SERVER['REMOTE_ADDR'];
$ip_file = file("ipban.dat");
foreach($ip_file as $value) {
if ($ip == trim($value)) {
echo "<div style=\"margin-top:20px; text-align:center\"><b><font color=red> К сожалению, с этого ip -> <font color=black>$ip</font>, доступ закрыт. <br />Обратитесь к <a href=\"mailto:webmaster@coder.hol.es?subject=Ban na saite (coder.hol.es)\">админу</a></font></b></div>";
exit();
}
}
?>
- Файл получения хэшей по md5
for_del_md5.php
(подлежит удалению!):
<?php
//удаляемый файл для генерации хэшей паролей
header('Content-Type: text/html; charset=utf-8');
$name = md5('test');
$password = md5('test');
$test_var= md5('test_var');
echo "$name -> Имя (test)<br> ";
echo "$password -> Пароль (test)<br> ";
echo "$test_var -> test_var (test_var)<br> ";
?>
Порядок установки:
- Скопировать файлы в нужное место; при необходимости указать соответствующие пути в файлах скрипта.
- Прописать свои имя, пароль и контрольную переменную в файле
for_del_md5.php
и запустить его; скопировать полученные хэши и вставить в значения соответствующих переменных в файлеcheck.php
, записать/запомнить себе и удалить файл. - Вставить
<?php include "ban_include.php";?>
в самый верх защищаемой страницы/сайта (в шаблон, шапку, страницу – до<!DOCTYPE>
). - Проверить работу скрипта и при успешном входе в админку, нажать "Сохранить" для вызова всплывающего окна.
*Для повышения безопасности рекомендуется переименовать запускной файл login_ban.php
, а также файл админки admban.php
и прописать новое имя в check.php
.
Комментарии:
Роман#
Изменил немного. Все ip берутся из базы данных, подскажите как сделать ban_include.php чтобы он сканировал базу с ip и сравнивал ее с ip клиента.
coder.hol.es /* Админ */#
Подключение к базе. Запрос к таблице базы на выборку. Помещение результата в переменную. Потом перебор в цикле foreach или while, например.
Сергей#
Попробовал Ваш скрипт, распаковал, поменял имя, пароль, переменную, прописал хеши в chek.php, запустил, chek.php пишет "Пароль не верен", все вернул в первоначальный вариант, Ваш, запускаю и опять вижу "Пароль не верен". Еще проблема, не мог войти в админку, через тестовую страницу, кнопка "В админку" не работает, менял линки на свои, тоже самое.
coder hol es#
Сейчас попробовал – зашел штатно. Очистите кэш браузера, или попробуйте с другого. Все скрипты тестируются, и, если что не работает, то нужно смотреть в правильности установки и особенностей хостинга/локала – возможно, используется версия php (хотя, работает на всех, вроде как), или конфигурация php.
Как вариант – уберите из скриптов вообще проверку — то есть, уберите из рабочего файла админки – и попробуйте поиспользовать напрямую, вызовом в адресной строке файла админки – потом попробуйте варианты возврата защиты. Да, и при проверке в браузере, лучше бы отключить кэш и перезагружать через
Ctrl+F5
Сергей#
Чистка кэша не помогла, полез копаться. Использую php 5.2.6. Почему то не обрабатываются кнопки с тегом <button></button>, разберусь потом, третий день голов в "мыле", переделал под себя, теперь перепрыгивает, ошибку 403 Forbidenn не победил, закомментировал условие проверки, в принципе заработало, как в целом, так и по отдельности. IP блочит. Спасибо за скрипт, но немного не то. Организация большая, и каждый ip блокировать долго и нудно. Хотя решилось за секунду, бан список переделал в белый список.