Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
Гость RSS-Bot

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

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

Гость 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']})");

 

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

Поделиться сообщением


Ссылка на сообщение
Гость 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',

Поделиться сообщением


Ссылка на сообщение
Гость RSS-Bot

Song: © Song

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации сообщений.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×
×
  • Создать...