php Запрет/бан доступа на сайт/страницу по ip через php 

Дата публикации  Дата изменения01.10.13  Комментарии9   Просмотры13244

Курсы

Скрипт запрета/бана доступа по ip на php с админкой, автоматической сортировкой и убиранием дублей. Обеспечивает удобный способ закрытия доступа без обращения к .htaccess.
Админка дублируется во всплывающем окне, что очень удобно при анализе лог-файлов и внесения определенных к бану ip в список.

Характеристики:

  • удобство пользования
  • единственная точка входа в скрипт (исключено прямое обращение к файлу админки)
  • простота и легкость настройки/использования
  • автоматическая сортировка и убирание дублей

Описание и пример использования:

Скрипт состоит из 5 файлов и одного служебного:

  1. login_ban.php — файл входа в админку
  2. check.php — файл проверки имени и пароля админки
  3. admban.php — админка с обработчиком
  4. ban_include.php — подключаемый файл для бана страницы/сайта
  5. ipban.dat — файл хранения забаненых ip
  6. for_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> ";
?>

Порядок установки:

  1. Скопировать файлы в нужное место; при необходимости указать соответствующие пути в файлах скрипта.
  2. Прописать свои имя, пароль и контрольную переменную в файле for_del_md5.php и запустить его; скопировать полученные хэши и вставить в значения соответствующих переменных в файле check.php, записать/запомнить себе и удалить файл.
  3. Вставить <?php include "ban_include.php";?> в самый верх защищаемой страницы/сайта (в шаблон, шапку, страницу – до <!DOCTYPE>).
  4. Проверить работу скрипта и при успешном входе в админку, нажать "Сохранить" для вызова всплывающего окна.

*Для повышения безопасности рекомендуется переименовать запускной файл login_ban.php, а также файл админки admban.php и прописать новое имя в check.php.

  Размер:  4,62kB | Изменен:  1.10.13 | Загрузок: 379
Бесплатные курсы

Категории

Теги: , , , , , , , , , , , , ,

Оцените материал:

Рейтинг: 8.4/10 (14)


КомментарииКомментарии:

    Роман

     

    Изменил немного. Все 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 блокировать долго и нудно. Хотя решилось за секунду, бан список переделал в белый список.


 

Старые →← Новые