Skip to content

Важное с Sysman.Ru: Добавление флуд-контроля для гостей

Song:

Вы не поверите, но в форуме IPB 1.х не существует ограничение для гостей на флуд.

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

И, если доступ гостей на ваш форум открыт, у них есть замечательная возможность зас@@ть (извиняюсь за выражение) ваш форум, посылая спам каждую секунду.

Это надо обязательно поправить.

 

Ниже я расскажу как это сделать.

Featured Replies

Song: Изменения нужно внести в файлы:

  • post_new_post.php
  • post_poll.php
  • post_reply_post.php
  • post_q_reply_post.php

Во всех них есть одинаковый кусок кода:

        [color=green]//-------------------------------------------------[/color]        [color=green]// If we are a member, lets update thier last post[/color]        [color=green]// date and increment their post count.[/color]        [color=green]//-------------------------------------------------[/color]                [color=#048284]$pcount[/color] = "";                [b]if[/b] ([color=#048284]$ibforums[/color]->member['id'])        {            [b]if[/b] ([color=#048284]$class[/color]->forum['inc_postcount'])            {                [color=green]// Increment the users post count[/color]                                [color=#048284]$pcount[/color] = "posts=posts+1, ";                            }                        [color=green]// Are we checking for auto promotion?[/color]                        [b]if[/b] ([color=#048284]$ibforums[/color]->member['g_promotion'] != '-1&-1')            {                list([color=#048284]$gid[/color], [color=#048284]$gposts[/color]) = explode( '&', [color=#048284]$ibforums[/color]->member['g_promotion'] );                                [b]if[/b] ( [color=#048284]$gid[/color] > [color=navy]0[/color] [b]and[/b] [color=#048284]$gposts[/color] > [color=navy]0[/color] )                {                    [b]if[/b] ( [color=#048284]$ibforums[/color]->member['posts'] + [color=navy]1[/color] >= [color=#048284]$gposts[/color] )                    {                        [color=#048284]$mgroup[/color] = "mgroup='$gid', ";                                                [b]if[/b] ( USE_MODULES == [color=navy]1[/color] )                        {                            [color=#048284]$class[/color]->modules->register_class(&[color=#048284]$class[/color]);                            [color=#048284]$class[/color]->modules->on_group_change([color=#048284]$ibforums[/color]->member['id'], [color=#048284]$gid[/color]);                        }                    }                }            }                        [color=#048284]$ibforums[/color]->member['last_post'] = time();                        [color=#048284]$DB[/color]->query("UPDATE ibf_members SET ".[color=#048284]$pcount[/color].[color=#048284]$mgroup[/color].                                              "last_post='"    .[color=#048284]$ibforums[/color]->member['last_post']   ."'".                                              "WHERE id='"     .[color=#048284]$ibforums[/color]->member['id']."'");        }

По этому куску кода также есть ещё одно замечание, см. Добавление в счётчик юзера

Можете сразу пофиксить.

 

Но вернёмся к исправлению.

Во-первых нужно добавить поле в таблицу ibf_sessions:

[color=blue][b]ALTER TABLE[/b][/color] ibf_sessions [color=green][b]ADD[/b][/color] last_post [color=green]INT[/color]([color=magenta]1[/color][color=magenta]0[/color]) unsigned [color=brown]default[/color] [color=brown]NULL[/color]

Во-вторых, в заголовке текущей функции есть объявление глобальных объектов, например:

        [b]global[/b] [color=#048284]$ibforums[/color], [color=#048284]$std[/color], [color=#048284]$DB[/color], [color=#048284]$print[/color];

В них нужно добавить объект $sess:

        [b]global[/b] [color=#048284]$ibforums[/color], [color=#048284]$std[/color], [color=#048284]$DB[/color], [color=#048284]$print[/color], [color=#048284]$sess[/color];

В-третьих, в вышеупомянутый кусок кода нужно добавить выделенные ниже цветом части:

        [color=green]//-------------------------------------------------        // If we are a member, lets update thier last post        // date and increment their post count.        //-------------------------------------------------[/color]                [color=#048284]$pcount[/color] = "";                [b]if[/b] ([color=#048284]$ibforums[/color]->member['id'])        {            [b]if[/b] ([color=#048284]$class[/color]->forum['inc_postcount'])            {                [color=green]// Increment the users post count[/color]                                [color=#048284]$pcount[/color] = "posts=posts+1, ";                            }                        [color=green]// Are we checking for auto promotion?[/color]                        [b]if[/b] ([color=#048284]$ibforums[/color]->member['g_promotion'] != '-1&-1')            {                list([color=#048284]$gid[/color], [color=#048284]$gposts[/color]) = explode( '&', [color=#048284]$ibforums[/color]->member['g_promotion'] );                                [b]if[/b] ( [color=#048284]$gid[/color] > [color=navy]0[/color] [b]and[/b] [color=#048284]$gposts[/color] > [color=navy]0[/color] )                {                    [b]if[/b] ( [color=#048284]$ibforums[/color]->member['posts'] + [color=navy]1[/color] >= [color=#048284]$gposts[/color] )                    {                        [color=#048284]$mgroup[/color] = "mgroup='$gid', ";                                                [b]if[/b] ( USE_MODULES == [color=navy]1[/color] )                        {                            [color=#048284]$class[/color]->modules->register_class(&[color=#048284]$class[/color]);                            [color=#048284]$class[/color]->modules->on_group_change([color=#048284]$ibforums[/color]->member['id'], [color=#048284]$gid[/color]);                        }                    }                }            }                        [color=#048284]$ibforums[/color]->member['last_post'] = time();                        [color=#048284]$DB[/color]->query("UPDATE ibf_members SET ".[color=#048284]$pcount[/color].[color=#048284]$mgroup[/color].                                              "last_post='"    .[color=#048284]$ibforums[/color]->member['last_post']   ."'".                                              "WHERE id='"     .[color=#048284]$ibforums[/color]->member['id']."'");        } [b]else[/b]        {            [color=#048284]$DB[/color]->query("UPDATE ibf_sessions SET last_post='".time()."' WHERE id='".addslashes([color=#048284]$sess[/color]->session_id)."'");        }

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

Для этого в вышеупомянутых 4-х файлах нужно найти:

        [b]if[/b] ( [color=#048284]$class[/color]->obj['moderate'] == [color=navy]1[/color] [b]OR[/b] [color=#048284]$class[/color]->obj['moderate'] == [color=navy]2[/color] )        {            ...                    [color=#048284]$DB[/color]->query("UPDATE ibf_forums SET has_mod_posts=1 WHERE id=".[color=#048284]$class[/color]->forum['id']);

Пожалуйста при поиске фрагмента имейте ввиду, что выделенное цветом число может меняться.

 

Во всех найденных фрагментах добавьте выделенную часть:

        [b]if[/b] ( [color=#048284]$class[/color]->obj['moderate'] == [color=navy]1[/color] [b]OR[/b] [color=#048284]$class[/color]->obj['moderate'] == [color=navy]2[/color] )        {            [b]if[/b] ( [color=#048284]$ibforums[/color]->member['id'] )            {                [color=#048284]$DB[/color]->query("UPDATE ibf_members SET last_post='".time()."' WHERE id='".[color=#048284]$ibforums[/color]->member['id']."'");            } [b]else[/b]            {                [color=#048284]$DB[/color]->query("UPDATE ibf_sessions SET last_post='".time()."' WHERE id='".addslashes([color=#048284]$sess[/color]->session_id)."'");            }            ...                    [color=#048284]$DB[/color]->query("UPDATE ibf_forums SET has_mod_posts=1 WHERE id=".[color=#048284]$class[/color]->forum['id']);

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

Для этого в вышеупомянутых 4-х файлах нужно найти:

        [b]if[/b] ( [color=#048284]$class[/color]->obj['moderate'] == [color=navy]1[/color] [b]OR[/b] [color=#048284]$class[/color]->obj['moderate'] == [color=navy]2[/color] )        {            ...                    [color=#048284]$DB[/color]->query("UPDATE ibf_forums SET has_mod_posts=1 WHERE id=".[color=#048284]$class[/color]->forum['id']);

Пожалуйста при поиске фрагмента имейте ввиду, что выделенное цветом число может меняться.

 

Во всех найденных фрагментах добавьте выделенную часть:

        [b]if[/b] ( [color=#048284]$class[/color]->obj['moderate'] == [color=navy]1[/color] [b]OR[/b] [color=#048284]$class[/color]->obj['moderate'] == [color=navy]2[/color] )        {            [b]if[/b] ( [color=#048284]$ibforums[/color]->member['id'] )            {                [color=#048284]$DB[/color]->query("UPDATE ibf_members SET last_post='".time()."' WHERE id='".[color=#048284]$ibforums[/color]->member['id']."'");            } [b]else[/b]            {                [color=#048284]$DB[/color]->query("UPDATE ibf_sessions SET last_post='".time()."' WHERE id='".addslashes([color=#048284]$sess[/color]->session_id)."'");            }            ...                    [color=#048284]$DB[/color]->query("UPDATE ibf_forums SET has_mod_posts=1 WHERE id=".[color=#048284]$class[/color]->forum['id']);

Song: (продолжение следует)

Song: Собственно само ограничение:

 

Найдите:

Цитата (Post.php)
            [color=green]// Flood check..[/color]                        [b]if[/b] ( [color=#048284]$ibforums[/color]->input['CODE'] != "08" [b]and[/b] [color=#048284]$ibforums[/color]->input['CODE'] != "09" [b]and[/b] [color=#048284]$ibforums[/color]->input['CODE'] != "14" [b]and[/b] [color=#048284]$ibforums[/color]->input['CODE'] != "15" )            {                [b]if[/b] ( [color=#048284]$ibforums[/color]->vars['flood_control'] > [color=navy]0[/color] )                {                    [b]if[/b] ([color=#048284]$ibforums[/color]->member['g_avoid_flood'] != [color=navy]1[/color])                    {                        [b]if[/b] ( time() - [color=#048284]$ibforums[/color]->member['last_post'] < [color=#048284]$ibforums[/color]->vars['flood_control'] )                        {                            [color=#048284]$std[/color]->Error( [b]array[/b]( 'LEVEL' => [color=navy]1[/color], 'MSG' => 'flood_control' , 'EXTRA' => [color=#048284]$ibforums[/color]->vars['flood_control'] ) );                        }                    }                }                            }

 

Замените на:

            [color=green]// Flood check..[/color]                        [b]if[/b] ( [color=#048284]$ibforums[/color]->input['CODE'] != "08" [b]and[/b] [color=#048284]$ibforums[/color]->input['CODE'] != "09" [b]and[/b] [color=#048284]$ibforums[/color]->input['CODE'] != "14" [b]and[/b] [color=#048284]$ibforums[/color]->input['CODE'] != "15" )            {                [b]if[/b] ( [color=#048284]$ibforums[/color]->member['id'] )                 {                            [color=green]// Member flood check..[/color]                    [b]if[/b] ( [color=#048284]$ibforums[/color]->member['g_avoid_flood'] != [color=navy]1[/color] )                    {                        [b]if[/b] ( time() - [color=#048284]$ibforums[/color]->member['last_post'] < [color=#048284]$ibforums[/color]->vars['flood_control'] )                        {                            [color=#048284]$std[/color]->Error(     [b]array[/b](                                             'LEVEL' => [color=navy]1[/color],                                         'MSG'     => 'flood_control' ,                                         'EXTRA' => [color=#048284]$ibforums[/color]->member['g_search_flood']                                 )     );                        }                    }                } [b]elseif[/b] ( [color=#048284]$ibforums[/color]->vars['flood_control'] )                {                         [color=green]// Additional flood check[/color]                    [color=#048284]$DB[/color]->query("SELECT last_post FROM ibf_sessions WHERE id='".addslashes([color=#048284]$sess[/color]->session_id)."' LIMIT 1");                            [color=#048284]$last_post[/color] = [color=#048284]$DB[/color]->fetch_row();                        [b]if[/b] ( [color=#048284]$last_post[/color]['last_post'] )                    {                        [b]if[/b] ( ( time() - [color=#048284]$last_post[/color]['last_post'] ) < [color=#048284]$ibforums[/color]->vars['flood_control'] )                        {                            [color=#048284]$std[/color]->Error( [b]array[/b](                                             'LEVEL' => [color=navy]1[/color],                                         'MSG'     => 'flood_control',                                         'EXTRA' => [color=#048284]$ibforums[/color]->vars['flood_control']                                 )     );                        }                    }                }            }
  • 5 weeks later...

Song: Вы можете заменить строчки:

[b]if[/b] ( time() - [color=#048284]$ibforums[/color]->member['last_post'] < [color=#048284]$ibforums[/color]->vars['flood_control'] )

[b]if[/b] ( time() - [color=#048284]$last_post[/color]['last_post'] < [color=#048284]$ibforums[/color]->vars['flood_control'] )

на:

[b]if[/b] ( time() - [color=#048284]$ibforums[/color]->member['last_post'] < [color=#048284]$ibforums[/color]->member['g_search_flood'] )

и

 [b]if[/b] ( time() - [color=#048284]$last_post[/color]['last_post'] < [color=#048284]$ibforums[/color]->member['g_search_flood'] )

соответственно.

 

Тем самым вы сделаете флуд контроль не единый для всех, который определяется переменной

[color=#048284]$INFO[/color]['flood_control']

файла conf_global.php,

а настройкой флуд-контроля при поиске для каждой группы.

Т.е. сделав флуд-контроль различным для каждой из групп, определяемой настройкой группы в Админ-центре.

Guest
This topic is now closed to further replies.

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.