PDA

View Full Version : Обновляем форум phpBB 2.0.18 до 2.0.19


BriaN
30.12.2005, 21:17
Открываем modules/Forums/admin/admin_board.php
Находим (19):
$module['General']['Configuration'] = "$file";
Заменяем на:
$module['General']['Configuration'] = $file;
Находим (194):
"L_MAX_POLL_OPTIONS" => $lang['Max_poll_options'],
"L_FLOOD_INTERVAL" => $lang['Flood_Interval'],
"L_FLOOD_INTERVAL_EXPLAIN" => $lang['Flood_Interval_explain'],
Ниже добавляем:
'L_MAX_LOGIN_ATTEMPTS' => $lang['Max_login_attempts'],
'L_MAX_LOGIN_ATTEMPTS_EXPLAIN' => $lang['Max_login_attempts_explain'],
'L_LOGIN_RESET_TIME' => $lang['Login_reset_time'],
'L_LOGIN_RESET_TIME_EXPLAIN' => $lang['Login_reset_time_explain'],
'MAX_LOGIN_ATTEMPTS' => $new['max_login_attempts'],
'LOGIN_RESET_TIME' => $new['login_reset_time'],
Открываем modules/Forums/admin/admin_db_utilities.php
Находим (696):
$tables = array('auth_access', 'banlist', 'categories', 'config', 'disallow', 'forums', 'forum_prune', 'groups', 'posts', 'posts_text', 'privmsgs', 'privmsgs_text', 'ranks', 'search_results', 'search_wordlist', 'search_wordmatch', 'sessions', 'smilies', 'themes', 'themes_name', 'topics', 'topics_watch', 'user_group', 'users', 'vote_desc', 'vote_results', 'vote_voters', 'words', 'confirm');
Заменяем на:
$tables = array('auth_access', 'banlist', 'categories', 'config', 'disallow', 'forums', 'forum_prune', 'groups', 'posts', 'posts_text', 'privmsgs', 'privmsgs_text', 'ranks', 'search_results', 'search_wordlist', 'search_wordmatch', 'sessions', 'smilies', 'themes', 'themes_name', 'topics', 'topics_watch', 'user_group', 'users', 'vote_desc', 'vote_results', 'vote_voters', 'words', 'confirm', 'sessions_keys');
Открываем modules/Forums/admin/admin_disallow.php
Находим (28):
$module['Users']['Disallow'] = append_sid($filename);
Заменяем на:
$module['Users']['Disallow'] = $filename;
Открываем modules/Forums/admin/admin_ranks.php
Находим (27):
$module['Users']['Ranks'] = "$file";
Заменяем на:
$module['Users']['Ranks'] = $file;
Открываем modules/Forums/admin/admin_styles.php
Находим (30):
$module['Styles']['Manage'] = "$file";
Заменяем на:
$module['Styles']['Manage'] = $file;
Открываем modules/Forums/admin/admin_users.php
Находим (180):
message_die(GENERAL_ERROR, 'Could not delete user from banlist table', '', __LINE__, __FILE__, $sql);
}
Ниже добавляем:
$sql = "DELETE FROM " . SESSIONS_TABLE . "
WHERE session_user_id = $user_id";
if ( !$db->sql_query($sql) )
{
message_die(GENERAL_ERROR, 'Could not delete sessions for this user', '', __LINE__, __FILE__, $sql);
}

$sql = "DELETE FROM " . SESSIONS_KEYS_TABLE . "
WHERE user_id = $user_id";
if ( !$db->sql_query($sql) )
{
message_die(GENERAL_ERROR, 'Could not delete auto-login keys for this user', '', __LINE__, __FILE__, $sql);
}
Находим (234):
$username = ( !empty($HTTP_POST_VARS['username']) ) ? trim(strip_tags(htmlspecialchars($HTTP_POST_VARS['username']))) : '';
Заменяем на:
$username = ( !empty($HTTP_POST_VARS['username']) ) ? phpbb_clean_username($HTTP_POST_VARS['username']) : '';
Находим (407):
if( @file_exists(@phpbb_realpath("./" . $board_config['avatar_path'] . "/" . $this_userdata['user_avatar'])) )
{
@unlink("./" . $board_config['avatar_path'] . "/" . $this_userdata['user_avatar']);
Заменяем на:
if( @file_exists(@phpbb_realpath('./../' . $board_config['avatar_path'] . "/" . $this_userdata['user_avatar'])) )
{
@unlink('./../' . $board_config['avatar_path'] . "/" . $this_userdata['user_avatar']);
Открываем modules/Forums/admin/admin_words.php
Находим (28):
$module['General']['Word_Censor'] = "$file";
Заменяем на:
$module['General']['Word_Censor'] = $file;
Открываем modules/Forums/admin/index.php
Находим (63):
include($file);
Заменяем на:
include('./' . $file);
Находим (237):
if( preg_match("/^(3\.23|4\.)/", $version) )
{
$db_name = ( preg_match("/^(3\.23\.[6-9])|(3\.23\.[1-9][1-9])|(4\.)/", $version) ) ? "`$dbname`" : $dbname;
Заменяем на:
if( preg_match("/^(3\.23|4\.|5\.)/", $version) )
{
$db_name = ( preg_match("/^(3\.23\.[6-9])|(3\.23\.[1-9][1-9])|(4\.)|(5\.)/", $version) ) ? "`$dbname`" : $dbname;
Открываем includes/bbcode.php
Находим (203):
$patterns[] = "#\([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*?)\[/url\]#is";
$replacements[] = $bbcode_tpl['url1'];

// [url]www.phpbb.com code.. (no xxxx:// prefix).
$patterns[] = "#\((www|ftp)\.[\w\#$%&~/.\-;:=,?@\[\]+]*?)\[/url\]#is";
Заменяем на:
$patterns[] = "#\[url\]([\w]+?://([\w\#$%&~/.\-;:=,?@\]+]|\[(?!url=))*?)\[/url\]#is";
$replacements[] = $bbcode_tpl['url1'];

// [url]www.phpbb.com code.. (no xxxx:// prefix).
$patterns[] = "#\[url\]((www|ftp)\.([\w\#$%&~/.\-;:=,?@\]+]|\[(?!url=))*?)\[/url\]#is";
Находим (255):
$text = bbencode_first_pass_pda($text, $uid, '/\/is', '', '', false, '', "");
Заменяем на:
$text = bbencode_first_pass_pda($text, $uid, '/\[quote=\\\\"(.*?)\\\\"\]/is', '', '', false, '', "[quote:$uid=\\\"\\1\\\"]");
Находим (392):
if( preg_match('#\[quote=\\\"#si', $possible_start, $match) && !preg_match('#\[quote=\\\"(.*?)\\\"\]#si', $possible_start) )
{
// OK we are in a quote tag that probably contains a ] bracket.
// Grab a bit more of the string to hopefully get all of it..
if ($close_pos = strpos($text, '"]', $curr_pos + 9))
{
if (strpos(substr($text, $curr_pos + 9, $close_pos - ($curr_pos + 9)), '[quote') === false)
{
$possible_start = substr($text, $curr_pos, $close_pos - $curr_pos + 2);
Заменяем на:
if( preg_match('#\[quote=\\\"#si', $possible_start, $match) && !preg_match('#\[quote=\\\"(.*?)\\\"\]#si', $possible_start) )
{
// OK we are in a quote tag that probably contains a ] bracket.
// Grab a bit more of the string to hopefully get all of it..
if ($close_pos = strpos($text, '"]', $curr_pos + 14))
{
if (strpos(substr($text, $curr_pos + 14, $close_pos - ($curr_pos + 14)), '[quote') === false)
{
$possible_start = substr($text, $curr_pos, $close_pos - $curr_pos + 7);
Открываем modules/Forums/common.php
Находим (223):
message_die(GENERAL_MESSAGE, 'Please ensure both the install/ and contrib/ directories are deleted');
Заменяем на:
message_die(GENERAL_MESSAGE, 'Please_remove_install_contrib');
Открываем includes/functions.php
Находим (161):
$sql .= ( ( is_integer($user) ) ? "user_id = $user" : "username = '" . $user . "'" ) . " AND user_id <> " . ANONYMOUS;
Заменяем на:
$sql .= ( ( is_integer($user) ) ? "user_id = $user" : "username = '" . str_replace("\'", "''", $user) . "'" ) . " AND user_id <> " . ANONYMOUS;
Открываем includes/functions_post.php
Находим (28):
$html_entities_match = array('#&(?!(\#[0-9]+;))#', '#<#', '#>#');
$html_entities_replace = array('&amp;', '&lt;', '&gt;');
Заменяем на:
$html_entities_match = array('#&(?!(\#[0-9]+;))#', '#<#', '#>#', '#"#');
$html_entities_replace = array('&amp;', '&lt;', '&gt;', '&quot;');
Открываем modules/Forums/usercp_confirm.php
Находим (156):
if (!empty($HTTP_GET_VARS['c']))
{
$_png = define_raw_pngs();

$char = substr($code, intval($HTTP_GET_VARS['c']) - 1, 1);
header('Content-Type: image/png');
header('Cache-control: no-cache, no-store');
echo base64_decode($_png[$char]);

unset($_png);
exit;
}
Заменяем на:
$_png = define_raw_pngs();

$char = substr($code, -1);
header('Content-Type: image/png');
header('Cache-control: no-cache, no-store');
echo base64_decode($_png[$char]);

unset($_png);
exit;

Открываем includes/usercp_register.php
Находим (110):
$strip_var_list = array('username' => 'username', 'email' => 'email', 'icq' => 'icq', 'aim' => 'aim', 'msn' => 'msn', 'yim' => 'yim', 'website' => 'website', 'location' => 'location', 'occupation' => 'occupation', 'interests' => 'interests');
$strip_var_list['confirm_code'] = 'confirm_code';
Заменяем на:
$strip_var_list = array('email' => 'email', 'icq' => 'icq', 'aim' => 'aim', 'msn' => 'msn', 'yim' => 'yim', 'website' => 'website', 'location' => 'location', 'occupation' => 'occupation', 'interests' => 'interests', 'confirm_code' => 'confirm_code');
Находим (126):
$trim_var_list = array('cur_password' => 'cur_password', 'new_password' => 'new_password', 'password_confirm' => 'password_confirm', 'signature' => 'signature');
Выше добавляем:
$username = ( !empty($HTTP_POST_VARS['username']) ) ? phpbb_clean_username($HTTP_POST_VARS['username']) : '';
Находим (301):
if ($row['code'] != $confirm_code)
Выше добавляем:
// Only compare one char if the zlib-extension is not loaded
if (!@extension_loaded('zlib'))
{
$row['code'] = substr($row['code'], -1);
}
Открываем modules/Forums/language/lang_english/lang_admin.php
Находим (749):
//
// That's all Folks!
Выше добавляем:
//
// Login attempts configuration
//
$lang['Max_login_attempts'] = 'Allowed login attempts';
$lang['Max_login_attempts_explain'] = 'The number of allowed board login attempts.';
$lang['Login_reset_time'] = 'Login lock time';
$lang['Login_reset_time_explain'] = 'Time in minutes the user have to wait until he is allowed to login again after exceeding the number of allowed login attempts.';
Открываем modules/Forums/language/lang_english/lang_main.php
Находим (1021):
//
// That's all, Folks!
Выше добавляем:
$lang['Login_attempts_exceeded'] = 'The maximum number of %s login attempts has been exceeded. You are not allowed to login for the next %s minutes.';
$lang['Please_remove_install_contrib'] = 'Please ensure both the install/ and contrib/ directories are deleted';
Открываем modules/Forums/language/lang_russian/lang_admin.php
Находим (749):
//
// That's all Folks!
Выше добавляем:
//
// Login attempts configuration
//
$lang['Max_login_attempts'] = 'Позволить попытки логина';
$lang['Max_login_attempts_explain'] = 'Число позволенных попыток логина на форуме.';
$lang['Login_reset_time'] = 'Время блокировки логина';
$lang['Login_reset_time_explain'] = 'Время в минутах, которое пользователь будет выжидать, пока ему не позволят залогинится снова, после превышения числа позволенных попыток логина.';
Открываем modules/Forums/language/lang_english/lang_main.php
Находим (1021):
//
// That's all, Folks!
Выше добавляем:
$lang['Login_attempts_exceeded'] = 'Максимальный число %s попыток логина было превышен. Вы не сможете залогинится в течение следующих %s минут.';
$lang['Please_remove_install_contrib'] = 'Пожалуйста убедитесь в том что директории install/ и contrib/ удалены';
Открываем modules/Forums/login.php
Находим (60):
$sql = "SELECT user_id, username, user_password, user_active, user_level
Заменяем на:
$sql = "SELECT user_id, username, user_password, user_active, user_level, user_login_tries, user_last_login_try
Находим (79):
if( md5($password) == $row['user_password'] && $row['user_active'] )
Выше добавляем:
// If the last login is more than x minutes ago, then reset the login tries/time
if ($row['user_last_login_try'] && $board_config['login_reset_time'] && $row['user_last_login_try'] < (time() - ($board_config['login_reset_time'] * 60)))
{
$db->sql_query('UPDATE ' . USERS_TABLE . ' SET user_login_tries = 0,

user_last_login_try = 0 WHERE user_id = ' . $row['user_id']);
$row['user_last_login_try'] = $row['user_login_tries'] = 0;
}

// Check to see if user is allowed to login again... if his tries are exceeded
if ($row['user_last_login_try'] && $board_config['login_reset_time'] &&

$board_config['max_login_attempts'] && $row['user_last_login_try'] >= (time() - ($board_config['login_reset_time'] * 60)) && $row['user_login_tries'] >= $board_config['max_login_attempts'])
{
message_die(GENERAL_MESSAGE, sprintf($lang['Login_attempts_exceeded'], $board_config['max_login_attempts'], $board_config['login_reset_time']));
}
Находим (97):
$admin = (isset($HTTP_POST_VARS['admin'])) ? 1 : 0;
$session_id = session_begin($row['user_id'], $user_ip, PAGE_INDEX, FALSE, $autologin, $admin);
Ниже добавляем:
// Reset login tries
$db->sql_query('UPDATE ' . USERS_TABLE . ' SET user_login_tries = 0, user_last_login_try = 0 WHERE user_id = ' . $row['user_id']);
Находим (115):
$redirect = ( !empty($HTTP_POST_VARS['redirect']) ) ? str_replace('&amp;', '&', htmlspecialchars($HTTP_POST_VARS['redirect'])) : '';
$redirect = str_replace('?', '&', $redirect);
Выше добавляем:
// Save login tries and last login
if ($row['user_id'] != ANONYMOUS)
{
$sql = 'UPDATE ' . USERS_TABLE . '
SET user_login_tries = user_login_tries + 1, user_last_login_try = ' . time() . '
WHERE user_id = ' . $row['user_id'];
$db->sql_query($sql);
}
Открываем modules/Private_Messages/index.php
Находим (38):
$html_entities_match = array('#&(?!(\#[0-9]+;))#', '#<#', '#>#');
$html_entities_replace = array('&amp;', '&lt;', '&gt;');
Заменяем на:
$html_entities_match = array('#&(?!(\#[0-9]+;))#', '#<#', '#>#', '#"#');
$html_entities_replace = array('&amp;', '&lt;', '&gt;', '&quot;');
Открываем modules/Forums/templates/subSilver/admin/board_config_body.tpl
Находим (59):
<td class="row2"><input class="post" type="text" size="3" maxlength="4" name="flood_interval" value="{FLOOD_INTERVAL}" /></td>
</tr>
Ниже добавляем:
<tr>
<td class="row1">{L_MAX_LOGIN_ATTEMPTS}<br /><span class="gensmall">{L_MAX_LOGIN_ATTEMPTS_EXPLAIN}</span></td>
<td class="row2"><input class="post" type="text" size="3" maxlength="4" name="max_login_attempts" value="{MAX_LOGIN_ATTEMPTS}" /></td>
</tr>
<tr>
<td class="row1">{L_LOGIN_RESET_TIME}<br /><span class="gensmall">{L_LOGIN_RESET_TIME_EXPLAIN}</span></td>
<td class="row2"><input class="post" type="text" size="3" maxlength="4" name="login_reset_time" value="{LOGIN_RESET_TIME}" /></td>
</tr>
Открываем modules/Forums/templates/subSilver/admin/index_body.tpl
Находим (46):
<td class="row2"><b>{GZIP_COMPRESSION}</b></td>
</tr>
</table>
Ниже добавляем:
<h1>{L_VERSION_INFORMATION}</h1>

{VERSION_INFO}

<br />
Находим и удаляем (87):
<h1>{L_VERSION_INFORMATION}</h1>

{VERSION_INFO}

<br />

Выполняем SQL-запрос (замените префикс nuke_ на свой):
INSERT INTO nuke_bbconfig (config_name, config_value) VALUES ('max_login_attempts', '5');
INSERT INTO nuke_bbconfig (config_name, config_value) VALUES ('login_reset_time', '30');
UPDATE nuke_bbconfig SET config_value='.0.19' where config_name='version';


Вот и всё, апгрейт форума до версии 2.0.19 успешно завершен :jumplol:

ssmol
31.12.2005, 12:38
имхо абсолютно бессмысленное обновление.
ибо у все нормальных людей уже давно стоят аналогичные моды

Soniks
31.12.2005, 13:02
ибо у все нормальных людей уже давно стоят аналогичные моды
а при чем здесь моды??

BriaN
31.12.2005, 13:13
Ну это обновление добавляет функцию запрета максимального количества попыток захода в аккаунт на форуме, хотя для bbtonuke это нафиг не надо, в общем короче просто надо ставить что бы обновить версию, темболее 2.0.20 должна точно из себя что то представлять.

ssmol
31.12.2005, 18:13
а при чем здесь моды??

а при том что с 2 модами выполняющими туже функцию что и это обновление оно конфликтует.

тем более сам принцип блокирования атакующего реализован тупо по первобытному. т.е. блокируется не ип атакующего а тот ник к которому подбирают пароль

мой выбор из щиты такого рода Protect user account блокировка атакующего идет по ип (с обновлением до 2.1.19 неконфликтует)

Soniks
31.12.2005, 19:39
ssmol обновление предоставлено не только вам, а всем пользователям, и у большинства не стоят ни какие моды
разумнее "банить" по логину, а не по паролю, т.к. спуфиры спокойно меняют проксю в таком случаи и продолжают перебор к уязвимому акаунту.

ssmol
31.12.2005, 19:52
Soniks да я и неговорю что оно ненадо (обновление) (и себе го прикрутил на один из дыух пхпбб) просто высказал мнение что странное оно
а поповожу проксей ну блоклст прокси пока никто неотменял :) хотя конечно понятно это дикая нгрузка на хостинг и многие хостеры пошлют нах с такой нагрузкой

да и брутфорс акаунта юзера это баловство самих же юзеров (типа почитать что другой в пм пишет) и ничего более ибо даже на акаунт админа админ пароль и пароль обычный Должны различатся. это элементарные правила. так же как и то что например модерами должны быть только люди определенного уровня знаний веб технологий но это имхо ибо реализовать это на практике такое малореально (не у всех есть возможность сидеть в админ панели 24/7 и в модерах и младшем админе иметь програмеров :) )