Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Опубликовано:

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']})");

 

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

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

Опубликовано:

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',
  • 4 недели спустя...
Опубликовано:

Song: © Song

Гость
Эта тема закрыта для дальнейших сообщений.

Сейчас на странице 0

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

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.