Jump to content
Дизайн и модификация Invision Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
Guest RSS-Bot

Важное с Sysman.Ru: Запаздывание удаления сессий ботов

Recommended Posts

Guest RSS-Bot

Song:

Описание проблемы:

Механизм авторизации ботов (роботов поисковых систем) выполняется несколько иначе чем механизм авторизации и работы с форумом участников форума или гостей. Это сделано по той причине, что боты не могут сохранять у себя куки.

При авторизации роботов-поисковиков из таблицы ibf_session сначала удаляется прошлая сессия (если она присутствовала), далее создаётся новая с ID в формате "Названиеробота_session".

 

Экспериментально выяснено, что часто в результе каких-то внутренних кеширований запросов СУБД MySQL прошлая сессия не удаляется и в этот момент уже начинает исполняться запрос по вставке в новой. А т.к. в таблице ibf_session на поле ID поставлен первичный ключ (PRIMARY KEY), происходит дублирование последнего и новая сессия не вставляется.

 

Как это выяснено?

Закономерный вопрос. Дело в том, что мы не знаем как роботы ходят на форум, соответственно не можем видеть те ошибки что им выдаёт или не выдаёт форум. Данный факт был обнаружен вследствие установки модификации, которая отсылает на email админку все запросы, которые вызывают ошибки.

Эта модификация была задумана совсем для другого (узнавать в первую очередь об ошибках в запросах и предупреждать sql-inj нападения), но в результате её работы выяснилась эта проблема.

 

Чем это плохо?

Дело в том, что при такой ошибке Яндекс-робот например вместо ожидаемой им страницы вашего форума для её индексации получит страницу с ошибкой драйвера IPS. В принципе здесь ничего страшного нет.

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

 

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

 

Исправление:

1.x:

Найдите:

Цитата (functions.php)
    [color=green]//-------------------------------------------[/color]    [color=green]// Creates a BOT session[/color]    [color=green]//-------------------------------------------[/color]        [b]function[/b] create_bot_session([color=#048284]$bot[/color])    {        [b]global[/b] [color=#048284]$DB[/color], [color=#048284]$INFO[/color], [color=#048284]$std[/color], [color=#048284]$ibforums[/color];                [color=#048284]$db_str[/color] = [color=#048284]$DB[/color]->compile_db_insert_string(                                                 [b]array[/b](                                                         'id'           => [color=#048284]$bot[/color].'_session',                                                         'member_name'  => [color=#048284]$ibforums[/color]->vars['sp_'.[color=#048284]$bot[/color]],                                                        'member_id'    => 0,                                                        'member_group' => [color=#048284]$ibforums[/color]->vars['spider_group'],                                                        'in_forum'     => intval([color=#048284]$ibforums[/color]->input['f']),                                                        'in_topic'     => intval([color=#048284]$ibforums[/color]->input['t']),                                                        'login_type'   => [color=#048284]$ibforums[/color]->vars['spider_anon'],                                                        'running_time' => [color=#048284]$this[/color]->time_now,                                                        'location'     => [color=#048284]$ibforums[/color]->input['act'].",".[color=#048284]$ibforums[/color]->input['p'].",".[color=#048284]$ibforums[/color]->input['CODE'],                                                        'ip_address'   => [color=#048284]$this[/color]->ip_address,                                                        'browser'      => [color=#048284]$this[/color]->user_agent,                                                      )                                              );                                                      [color=#048284]$DB[/color]->query("INSERT INTO ibf_sessions ({$db_str['FIELD_NAMES']}) VALUES({$db_str['FIELD_VALUES']})");                           }

 

Замените:

        [color=#048284]$DB[/color]->query("INSERT INTO ibf_sessions ({$db_str['FIELD_NAMES']}) VALUES({$db_str['FIELD_VALUES']})");

на:

        [color=#048284]$DB[/color]->query("REPLACE INTO ibf_sessions ({$db_str['FIELD_NAMES']}) VALUES({$db_str['FIELD_VALUES']})");

 

Суть сего изменения заключается в том, что мы заменяем два запроса (удаление и вставка) на один, который внутри СУБД выполнит два, но это уже не наше дело.

Share this post


Link to post
Guest RSS-Bot

Song: В 2.1.х дело обстоит гораздо сложнее.

 

Найдите

Цитата (ips_kernel/class_db_mysql.php)
    [color=green]/*-------------------------------------------------------------------------*/[/color]    [color=green]// Quick function: DO INSERT[/color]    [color=green]/*-------------------------------------------------------------------------*/[/color]        [b]function[/b] do_insert( [color=#048284]$tbl[/color], [color=#048284]$arr[/color], [color=#048284]$shutdown[/color]=FALSE )    {        [color=green]//-----------------------------------------[/color]        [color=green]// Form query[/color]        [color=green]//-----------------------------------------[/color]                [color=#048284]$dba[/color]   = [color=#048284]$this[/color]->compile_db_insert_string( [color=#048284]$arr[/color] );        [color=#048284]$query[/color] = "INSERT INTO ".[color=#048284]$this[/color]->obj['sql_tbl_prefix']."$tbl ({$dba['FIELD_NAMES']}) VALUES({$dba['FIELD_VALUES']})";        [color=green]//-----------------------------------------[/color]        [color=green]// Shut down query?[/color]        [color=green]//-----------------------------------------[/color]                [b]if[/b] ( [color=#048284]$shutdown[/color] )        {            [b]if[/b] ( ! [color=#048284]$this[/color]->obj['use_shutdown'] )            {                [color=#048284]$this[/color]->is_shutdown = 1;                [b]return[/b] [color=#048284]$this[/color]->query( [color=#048284]$query[/color] );            }            [b]else[/b]            {                [color=#048284]$this[/color]->obj['shutdown_queries'][] = [color=#048284]$query[/color];                [color=#048284]$this[/color]->cur_query = "";            }        }        [b]else[/b]        {            [b]return[/b] [color=#048284]$this[/color]->query( [color=#048284]$query[/color] );        }    }

 

Поместите рядом копию этой же функции и в ней исправьте:

    [color=green]// Quick function: DO INSERT[/color]

на:

    [color=green]// Quick function: DO INSERT REPLACE[/color]

 

    [b]function[/b] do_insert( [color=#048284]$tbl[/color], [color=#048284]$arr[/color], [color=#048284]$shutdown[/color]=FALSE )

на:

    [b]function[/b] do_insertreplace( [color=#048284]$tbl[/color], [color=#048284]$arr[/color], [color=#048284]$shutdown[/color]=FALSE )

 

        [color=#048284]$query[/color] = "INSERT INTO ".[color=#048284]$this[/color]->obj['sql_tbl_prefix']."$tbl ({$dba['FIELD_NAMES']}) VALUES({$dba['FIELD_VALUES']})";

на:

        [color=#048284]$query[/color] = "REPLACE INTO ".[color=#048284]$this[/color]->obj['sql_tbl_prefix']."$tbl ({$dba['FIELD_NAMES']}) VALUES({$dba['FIELD_VALUES']})";

 

Далее:

найдите:

Цитата (sources/classes/class_session.php)
    [b]function[/b] create_bot_session([color=#048284]$bot[/color], [color=#048284]$name[/color]="")    {        [color=green]//-----------------------------------------[/color]        [color=green]// Get module settings[/color]        [color=green]//-----------------------------------------[/color]                [color=#048284]$vars[/color] = [color=#048284]$this[/color]->_get_location_settings();                [color=#048284]$this[/color]->ipsclass->DB->do_shutdown_insert( 'sessions',                                                 [b]array[/b](                                                        'id'                 => [color=#048284]$bot[/color].'='.str_replace('.','',[color=#048284]$this[/color]->ipsclass->ip_address ).'_session',                                                        'member_name'        => [color=#048284]$name[/color] ? [color=#048284]$name[/color] : [color=#048284]$bot[/color],                                                        'member_id'          => 0,                                                        'member_group'       => [color=#048284]$this[/color]->ipsclass->vars['spider_group'],                                                        'login_type'         => [color=#048284]$this[/color]->ipsclass->vars['spider_anon'],                                                        'running_time'       => [color=#048284]$this[/color]->time_now,                                                        'ip_address'         => [color=#048284]$this[/color]->ipsclass->ip_address,                                                        'browser'            => [color=#048284]$this[/color]->ipsclass->user_agent,                                                        'location'           => [color=#048284]$vars[/color]['location'],                                                        'in_error'           => 0,                                                        'location_1_type'    => [color=#048284]$vars[/color]['1_type'],                                                        'location_1_id'      => [color=#048284]$vars[/color]['1_id'],                                                        'location_2_type'    => [color=#048284]$vars[/color]['2_type'],                                                        'location_2_id'      => [color=#048284]$vars[/color]['2_id'],                                                        'location_3_type'    => [color=#048284]$vars[/color]['3_type'],                                                        'location_3_id'      => [color=#048284]$vars[/color]['3_id'],                                                      )                                              );    }

 

Замените в этой функции:

[color=#048284]$this[/color]->ipsclass->DB->do_shutdown_insert( 'sessions',

на:

[color=#048284]$this[/color]->ipsclass->DB->do_insertreplace( 'sessions',

Share this post


Link to post
Guest RSS-Bot

Song: © Song

Share this post


Link to post
Guest
This topic is now closed to further replies.
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...