Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Исправить файловый скрипт ip-банна на MySQL-вариант
 
 автор: Veb   (18.07.2007 в 23:30)   письмо автору
 
 

Здравствуйте уважаемые разработчики!
Собственно сабж. Есть такой код:

<?php
/* Сообщение при банне ip */
define("bann_message", "Для вашего IP: %ip% доступ к сайту закрыт.");

/* Предупреждение о возможности банна по ip */
define("wrong_message", "Вы предупреждены администратором данного сайта о возможной блокировке вашего IP: %ip% в случае дальнейшего нарушения правил.");

/* массив с ip и типом блокировки. в ключе массива IP, в значении тип блокировки */
$bann_array = array(
"195.66.203.247"=>"bann", // реальный плохой IP
"220.94.220.60"=>"bann", // реальный плохой IP
//"127.0.0.1"=>"wrong" // Test
);

/* Функция для почти 100% определения IP адреса посетителя. */
/* Перебирает все возможные переменные с IP. */
function _ip()
{
if(isset($HTTP_SERVER_VARS)) {
if(isset($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"])) {
$realip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
}elseif(isset($HTTP_SERVER_VARS["HTTP_CLIENT_IP"])) {
$realip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];
}else{
$realip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
}
}else{
if(getenv( 'HTTP_X_FORWARDED_FOR' ) ) {
$realip = getenv( 'HTTP_X_FORWARDED_FOR' );
}elseif ( getenv( 'HTTP_CLIENT_IP' ) ) {
$realip = getenv( 'HTTP_CLIENT_IP' );
}else {
$realip = getenv( 'REMOTE_ADDR' );
}
}
return $realip;
}

/* Определяет, что делать с владельцем того или иного ip адреса */
function bann_on_not_to_bann()
{
global $bann_array; // получаем массив с ip адресами
$user_ip = _ip(); // получаем ip

/* разбираем массив на ключ и значение */
foreach($bann_array as $ip=>$type)
{
if ($ip == $user_ip) // проверяем
{
switch($type) // если ip совпал то смотрим что делать
{
case "wrong": // предупреждение
{
echo str_replace("%ip%", $user_ip, wrong_message); // выводим предупреждение
break; // выход из switch
}
case "bann": // блокировка
{
die(str_replace("%ip%", $user_ip, bann_message)); // Сообщение о том, что доступ закрыт + завершение работы php
// break не требуется т.к. дальше уже ничего не выполняется
}
}
}
}
}

/* проверяем владельца ip и блокируемпредупреждаем если это спамер */
bann_on_not_to_bann();
?>
Вопрос следующий: в этом примере используется массив с ip-адресами, что очень неудобно, т.к. хочу хранить ip-адреса и статус бана (т.е. бан или предупреждение) в базе данных MySQL. Как правильно модифицировать этот код?

   
 
 автор: cheops   (19.07.2007 в 09:52)   письмо автору
 
   для: Veb   (18.07.2007 в 23:30)
 

В первую очередь необходимо создать таблицу bann, где будут храниться IP-адреса
CREATE TABLE bann (
id_ban INT NOT NULL AUTO_INCREMENT ,
ip TINYTEXT NOT NULL ,
bann_status ENUM( 'bann', 'wrong' ) DEFAULT 'bann' NOT NULL ,
PRIMARY KEY (id_ban) 
);

   
 
 автор: cheops   (19.07.2007 в 09:54)   письмо автору
 
   для: Veb   (18.07.2007 в 23:30)
 

Затем необходимо содать файл (config.php), при помощи которого вы будете осуществлять соединение с базой данных
<?php
  
// сейчас выставлен сервер локальной машины
  
$dblocation "localhost";
  
// Имя базы данных, на хостинге или локальной машине
  
$dbname "test";
  
// Имя пользователя базы данных
  
$dbuser "root";
  
// и его пароль
  
$dbpasswd "";

  
// Устанавливаем соединение с базой данных
  
$dbcnx mysql_connect($dblocation,$dbuser,$dbpasswd);
  if (!
$dbcnx) {
   exit( 
"<P>В настоящий момент сервер базы данных не доступен, поэтому корректное отображение страницы невозможно.</P>" );
  }
  
// Выбираем базу данных
  
if (! @mysql_select_db($dbname,$dbcnx) ) {
    exit( 
"<P>В настоящий момент база данных не доступна, поэтому корректное отображение страницы невозможно.</P>" );
  }

  @
mysql_query("SET NAMES 'cp1251'");
?>

   
 
 автор: cheops   (19.07.2007 в 10:00)   письмо автору
 
   для: Veb   (18.07.2007 в 23:30)
 

После этого участок кода, ответственный за формирование массива $bann_array
<?php
$bann_array 
= array(
"195.66.203.247"=>"bann"// реальный плохой IP
"220.94.220.60"=>"bann"// реальный плохой IP
//"127.0.0.1"=>"wrong" // Test
);
?>

следует переписать следующим образом
<?php
  
// Устанавливаем соединение с базой данных
  
require_once("config.php");

  
$query "SELECT * FROM bann";
  
$ban mysql_query($query);
  if(!
$ban) exit("Ошибка обращения к таблице ".mysql_error());
  
$bann_array = array();
  if(
mysql_num_rows($ban))
  {
     while(
$bann mysql_fetch_array($ban))
     {
        
$bann_array[$bann['ip']] = $bann['bann_status'];
     }
  }
?>

PS Решение не самое эффективное, но позволяет внести изменения в скрипт малой кровью, если же количество записей в таблице bann предполагается очень большим, лучше создать скрипт с нуля, отказавшись от модификации существующего.

   
 
 автор: Veb   (20.07.2007 в 20:50)   письмо автору
 
   для: cheops   (19.07.2007 в 10:00)
 

Большое спасибо! Сейчас буду пробовать!

П.С. огромный респект за книгу PHP5!

   
 
 автор: Veb   (21.07.2007 в 00:00)   письмо автору
 
   для: Veb   (20.07.2007 в 20:50)
 

Чет не хочет работать...Просто показывает пустую страницу
Вопрос еще такой: что обозначает это "@mysql_query("SET NAMES 'cp1251'"); " ?

   
 
 автор: cheops   (21.07.2007 в 11:27)   письмо автору
 
   для: Veb   (21.07.2007 в 00:00)
 

Где тестируете на локальной машине (другие скрипты, с использованием MySQL работают нормально)?

>Вопрос еще такой: что обозначает это "@mysql_query("SET NAMES 'cp1251'"); " ?
Это настройка кодировки соединения, конкретно здесь этого не требуется, однако, если файл будет использоваться для работы с русскими символами - это позволит предотвратить их искажение.

   
 
 автор: veb   (27.07.2007 в 12:45)   письмо автору
 
   для: cheops   (21.07.2007 в 11:27)
 

тестирую на локальной машине, apache2.2.4+mysql4.0.16+php5.2.3 под виндами. другие скрипты соединяются с mysql нормально

   
 
 автор: Trianon   (27.07.2007 в 12:49)   письмо автору
 
   для: veb   (27.07.2007 в 12:45)
 

есть ли хотя бы один php-скрипт, работающий с БД MySQL у Вас на сайте?
Перепишите код соединения из него.

   
 
 автор: Veb   (29.07.2007 в 14:13)   письмо автору
 
   для: Trianon   (27.07.2007 в 12:49)
 

я с самого начала свой конфиг вместо предложенного поставил, тоже самое было. потом подумал, может я что-то не догоняю и поставил этот - результат один и тот же. еще попробую у себя на хостинге потестить.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования