Перейти к контенту

О флуд контроле замолвим словечко...


Рекомендуемые сообщения

ч. I. Разный флуд контроль для разных групп пользователей.

В форуме IPB предусмотрен флуд контроль. Один на всех. Единственное, что его можно отключить для групп. Но этого не хватает. Нередко нужно, чтобы для одной из групп, например группы "наказанных", флуд контроль был выше чем для остальных.

Как это сделать.

Чтобы сделать красиво, мы должны сделать запрос ALTER TABLE для таблицы ibf_forums, чтобы выделить новое поле. Но потом придётся ещё редактировать ad_forums.php, мне было лень, поэтому я воспользовался другой возможность. В админке есть флуд контроль для групп, но для поиска. Предлагаю воспользоваться этим периодом и для флуд контроля для постов. Таким образом, мы будем иметь одинаковое время для флуд контроля и для поиска и для сообщений.

1) Файл functions.php

Находим

if ( $DB->get_num_rows() ) $this->member = $DB->fetch_row();

В запросе выше перед

FROM ibf_members m

добавляем

, g.g_search_flood

 

2) Файл post.php

Находим

if ( time() - $ibforums->member['last_post'] < $ibforums->vars['flood_control'] )
  	{
    $std->Error( array( 'LEVEL' => 1, 'MSG' => 'flood_control' , 'EXTRA' => $ibforums->vars['flood_control'] ) );
  	}

 

и меняем в этому кусочке $ibforums->vars['flood_control'] ) на $ibforums->member['g_search_flood']

 

 

ч. II Флуд контроль для гостей

 

Невероятно, но в форуме IPB нет флуд контроля для гостей. Почему? Потому что для гостей в стандартной системе таблиц нигде не сохраняется время последнего поста.

Надо это пофиксить по-любому.

Как это сделать:

 

1. Выполняем команды

ALTER TABLE ibf_sessions ADD last_post int(10) default NULL
ALTER TABLE ibf_sessions ADD INDEX (ip_address)

 

2. В файлах post_new_post, post_poll, post_q_reply_post, post_reply_post

найти кусок кода

 	if ($ibforums->member['id'])
  {
  	if ($class->forum['inc_postcount'])
  	{
    // Increment the users post count
    
    $pcount = "posts=posts+1, ";
    
  	}

Находим закрывающую скобку от начала кода "if ($ibforums->member['id']) {" (внимание! пИсать надо не после этого кода, а после закрывающей скобки от этой)

и после неё пишем:

// Song * additional flood control

  $DB->query("UPDATE ibf_sessions SET last_post='".time()."' WHERE ip_address='".$ibforums->input['IP_ADDRESS']."'");
// Song

 

3. Файл post.php

Находим

        //--------------------------------------
        // Are we allowed to post at all?
        //--------------------------------------

        if ($ibforums->member['id'])
        {

 

Далее, ниже находим

 

       	if ( $ibforums->input['CODE'] != "08" and $ibforums->input['CODE'] != "09" and 
             $ibforums->input['CODE'] != "14" and $ibforums->input['CODE'] != "15" )

Удаляем этот кусок (от начала этих строк и до закрывающей скобки этого куска).

 

Перемещаемся снова вверх на код

        //--------------------------------------
        // Are we allowed to post at all?
        //--------------------------------------

        if ($ibforums->member['id'])

и перед ним пишем:

// Song * Additional flood check

       	if ( $ibforums->input['CODE'] != "08" and $ibforums->input['CODE'] != "09" and 
             $ibforums->input['CODE'] != "14" and $ibforums->input['CODE'] != "15" )
  if ( $ibforums->vars['flood_control'] > 0 )
          if ( $ibforums->member['id'] ) 
    {
         // Flood check..

  if ($ibforums->member['g_avoid_flood'] != 1)
  {
  	if ( time() - $ibforums->member['last_post'] < $ibforums->vars['flood_control'] )
  	{
    $std->Error( array( 'LEVEL' => 1, 'MSG' => 'flood_control' , 'EXTRA' => $ibforums->vars['flood_control'] ) );
  	}
  }

    } else
    {
          // Additional flood check
      $DB->query("SELECT last_post FROM ibf_sessions WHERE ip_address='".$ibforums->input['IP_ADDRESS']."' LIMIT 1");
      $last_post = $DB->fetch_row();

      if ($last_post['last_post'])
   {
     if ( ( time() - $last_post['last_post'] ) < $ibforums->vars['flood_control'] )
       {
    $std->Error( array( 'LEVEL' => 1, 'MSG' => 'flood_control' , 'EXTRA' => $ibforums->vars['flood_control'] ) );
       }
   }

    }

// Song * Additional flood check

 

Итак, вместе с модификацией из ч. I это будет выглядеть так:

// Song * Additional flood check

       	if ( $ibforums->input['CODE'] != "08" and $ibforums->input['CODE'] != "09" and 
             $ibforums->input['CODE'] != "14" and $ibforums->input['CODE'] != "15" )
  if ( $ibforums->vars['flood_control'] > 0 )
          if ( $ibforums->member['id'] ) 
    {
         // Flood check..

  if ($ibforums->member['g_avoid_flood'] != 1)
  {
  	if ( time() - $ibforums->member['last_post'] < $ibforums->member['g_search_flood'] )
  	{
    $std->Error( array( 'LEVEL' => 1, 'MSG' => 'flood_control' , 'EXTRA' => $ibforums->member['g_search_flood'] ) );
  	}
  }

    } else
    {
          // Additional flood check

      $DB->query("SELECT last_post FROM ibf_sessions WHERE ip_address='".$ibforums->input['IP_ADDRESS']."' LIMIT 1");
      $last_post = $DB->fetch_row();

      if ($last_post['last_post'])
   {
     if ( ( time() - $last_post['last_post'] ) < $ibforums->vars['flood_control'] )
       {
    $std->Error( array( 'LEVEL' => 1, 'MSG' => 'flood_control' , 'EXTRA' => $ibforums->vars['flood_control'] ) );
       }
   }

    }

// Song * Additional flood check

 

Итак что имеем:

1) Для разных групп пользователей флуд контроль назначается в правах этих групп в поле флуд контроля для поиска

2) Флуд контроль, который назначается в системных установках ACP действует только на гостей.

Ссылка на комментарий
Поделиться на других сайтах

ч. III Исправление модификации склейки совместно с флуд контролем

 

У многих администраторов на форуме стоит модификация склейки.

При склейке контроль на флуд не производится. Главным образом, наверно потому, что принято, что флуд контроль защищает от количества сообщений, а не от количества запросов в БД.

Предлагаю пофиксить.

Файлы post_reply_post.php и post_q_reply_post.php:

 

1) Находим:

$this->post['post'] = $this->lastpost['post']

Перед ним вставляем

// Song * Flood check..

  	if ($ibforums->member['g_avoid_flood'] != 1)
  	{
    if ( time() - $ibforums->member['last_post'] < $ibforums->member['g_search_flood'] )
    {
    	$std->Error( array( 'LEVEL' => 1, 'MSG' => 'flood_control' , 'EXTRA' => $ibforums->member['g_search_flood'] ) );
    }
  	}

// Song * Flood check..

 

2) Чуть ниже находим

if(!$ibforums->vars['plg_disable_redirect'])

Перед ним вставляем

$DB->query("UPDATE ibf_members SET last_post='".time()."' WHERE id='".$ibforums->member['id']."'");

 

Насколько я понял склейка не вызывается для гостей, из-за чего я и использовал только $ibforums->member['g_search_flood']

Внимание! ч. III модификации использует правки из ч. I

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

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

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.