Сообщаем об ошибках phpBB 3.0.x разработчикам
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение
).
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение
-
Alek$
- Former team member
- Сообщения: 2616
- Стаж: 21 год 1 месяц
- Откуда: Новосибирск
- Поблагодарили: 37 раз
Re: Сообщаем об ошибках phpBB 3.0.x разработчикам
mih_io
Выглядит разумно, спасибо.
Выглядит разумно, спасибо.
Самая страшная ошибка, это ошибка без видимых причин и конкретных последствий.
phpBB3 [db_update.php generator]
Первая помощь по всем phpBB-вопросам: phpBB2 и phpBB3 FAQ; Правила общения;
Все консультации в icq или личке - на платной основе.
phpBB3 [db_update.php generator]
Первая помощь по всем phpBB-вопросам: phpBB2 и phpBB3 FAQ; Правила общения;
Все консультации в icq или личке - на платной основе.
-
outta
- phpBB 1.2.0
- Сообщения: 11
- Стаж: 15 лет 9 месяцев
Re: Сообщаем об ошибках phpBB 3.0.x разработчикам
Продукт: phpBB 3.0.8
Скрипт: viewtopic.php
Описание: неверная обработка параметра
Следствие: (для нормального пользователя) некорректная работа с правами в важных темах; (для остальных) повышение собственных прав доступа на чтение закрытых разделов конференции
Суть проблемы:
В коде формирования запроса на получения данных о запрашиваемом топике допущена ошибка.Проявляется она при (где
Следующий далее во viewtopic.php код выставляет для нашего запроса неверный идентификатор форума:тем самым подсовывая функциям проверки прав из класса
Вывод: имея доступ к первому форуму на конференции (в приведённом примере — к форуму с
Временный костыль: я заменил проблемный код (указан мной в начале сообщения) следующим:Использование
Что скажут Гуру?
Скрипт: viewtopic.php
Описание: неверная обработка параметра
f при инициализации скриптаСледствие: (для нормального пользователя) некорректная работа с правами в важных темах; (для остальных) повышение собственных прав доступа на чтение закрытых разделов конференции
Суть проблемы:
В коде формирования запроса на получения данных о запрашиваемом топике допущена ошибка.
Код: Выделить всё
// This rather complex gaggle of code handles querying for topics but
// also allows for direct linking to a post (and the calculation of which
// page the post is on and the correct display of viewtopic)
$sql_array = array(
'SELECT' => 't.*, f.*',
'FROM' => array(FORUMS_TABLE => 'f'),
);
// Firebird handles two columns of the same name a little differently, this
// addresses that by forcing the forum_id to come from the forums table.
if ($db->sql_layer === 'firebird')
{
$sql_array['SELECT'] = 'f.forum_id AS forum_id, ' . $sql_array['SELECT'];
}
// The FROM-Order is quite important here, else t.* columns can not be correctly bound.
if ($post_id)
{
$sql_array['SELECT'] .= ', p.post_approved';
$sql_array['FROM'][POSTS_TABLE] = 'p';
}
// Topics table need to be the last in the chain
$sql_array['FROM'][TOPICS_TABLE] = 't';
if ($user->data['is_registered'])
{
$sql_array['SELECT'] .= ', tw.notify_status';
$sql_array['LEFT_JOIN'] = array();
$sql_array['LEFT_JOIN'][] = array(
'FROM' => array(TOPICS_WATCH_TABLE => 'tw'),
'ON' => 'tw.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tw.topic_id'
);
if ($config['allow_bookmarks'])
{
$sql_array['SELECT'] .= ', bm.topic_id as bookmarked';
$sql_array['LEFT_JOIN'][] = array(
'FROM' => array(BOOKMARKS_TABLE => 'bm'),
'ON' => 'bm.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = bm.topic_id'
);
}
if ($config['load_db_lastread'])
{
$sql_array['SELECT'] .= ', tt.mark_time, ft.mark_time as forum_mark_time';
$sql_array['LEFT_JOIN'][] = array(
'FROM' => array(TOPICS_TRACK_TABLE => 'tt'),
'ON' => 'tt.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tt.topic_id'
);
$sql_array['LEFT_JOIN'][] = array(
'FROM' => array(FORUMS_TRACK_TABLE => 'ft'),
'ON' => 'ft.user_id = ' . $user->data['user_id'] . ' AND t.forum_id = ft.forum_id'
);
}
}
if (!$post_id)
{
$sql_array['WHERE'] = "t.topic_id = $topic_id";
}
else
{
$sql_array['WHERE'] = "p.post_id = $post_id AND t.topic_id = p.topic_id";
}
$sql_array['WHERE'] .= ' AND (f.forum_id = t.forum_id';
if (!$forum_id)
{
// If it is a global announcement make sure to set the forum id to a postable forum
$sql_array['WHERE'] .= ' OR (t.topic_type = ' . POST_GLOBAL . '
AND f.forum_type = ' . FORUM_POST . ')';
}
else
{
$sql_array['WHERE'] .= ' OR (t.topic_type = ' . POST_GLOBAL . "
AND f.forum_id = $forum_id)";
}
$sql_array['WHERE'] .= ')'; $forum_id == false. Составляется ошибочный запрос к базе:Код: Выделить всё
SELECT t.*, f.*, tw.notify_status, bm.topic_id as bookmarked, tt.mark_time, ft.mark_time as forum_mark_time
FROM (phpbb_forums f, phpbb_topics t)
LEFT JOIN phpbb_topics_watch tw ON (tw.user_id = 2 AND t.topic_id = tw.topic_id)
LEFT JOIN phpbb_bookmarks bm ON (bm.user_id = 2 AND t.topic_id = bm.topic_id)
LEFT JOIN phpbb_topics_track tt ON (tt.user_id = 2 AND t.topic_id = tt.topic_id)
LEFT JOIN phpbb_forums_track ft ON (ft.user_id = 2 AND t.forum_id = ft.forum_id)
WHERE t.topic_id = 2 AND (f.forum_id = t.forum_id OR (f.forum_type = 1))user_id и topic_id могут быть любым). Результатом такого запроса является не одна строка, как это по логике ожидается, а целая таблица:
в которой столбец forum_id содержится дважды, а второе значение переопределяет первое.Следующий далее во viewtopic.php код выставляет для нашего запроса неверный идентификатор форума:
Код: Выделить всё
$sql = $db->sql_build_query('SELECT', $sql_array);
$result = $db->sql_query($sql);
$topic_data = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
// link to unapproved post or incorrect link
if (!$topic_data)
{
...
}
$forum_id = (int) $topic_data['forum_id']; $auth (acl_get) другое значение.Вывод: имея доступ к первому форуму на конференции (в приведённом примере — к форуму с
forum_id = 2) мы можем прочитать любую тему просто немного изменив запрос к viewtopic.php.Временный костыль: я заменил проблемный код (указан мной в начале сообщения) следующим:
Код: Выделить всё
// This rather complex gaggle of code handles querying for topics but
// also allows for direct linking to a post (and the calculation of which
// page the post is on and the correct display of viewtopic)
$sql_array = array(
'SELECT' => 't.*, f.*',
'LEFT_JOIN' => array(),
);
$sql_array['LEFT_JOIN'][] = array(
'FROM' => array(FORUMS_TABLE => 'f'),
'ON' => 'f.forum_id = t.forum_id'
);
// Firebird handles two columns of the same name a little differently, this
// addresses that by forcing the forum_id to come from the forums table.
if ($db->sql_layer === 'firebird')
{
$sql_array['SELECT'] = 'f.forum_id AS forum_id, ' . $sql_array['SELECT'];
}
// The FROM-Order is quite important here, else t.* columns can not be correctly bound.
if ($post_id)
{
$sql_array['SELECT'] .= ', p.post_approved';
$sql_array['FROM'][POSTS_TABLE] = 'p';
}
// Topics table need to be the last in the chain
$sql_array['FROM'][TOPICS_TABLE] = 't';
if ($user->data['is_registered'])
{
$sql_array['SELECT'] .= ', tw.notify_status';
$sql_array['LEFT_JOIN'][] = array(
'FROM' => array(TOPICS_WATCH_TABLE => 'tw'),
'ON' => 'tw.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tw.topic_id'
);
if ($config['allow_bookmarks'])
{
$sql_array['SELECT'] .= ', bm.topic_id as bookmarked';
$sql_array['LEFT_JOIN'][] = array(
'FROM' => array(BOOKMARKS_TABLE => 'bm'),
'ON' => 'bm.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = bm.topic_id'
);
}
if ($config['load_db_lastread'])
{
$sql_array['SELECT'] .= ', tt.mark_time, ft.mark_time as forum_mark_time';
$sql_array['LEFT_JOIN'][] = array(
'FROM' => array(TOPICS_TRACK_TABLE => 'tt'),
'ON' => 'tt.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tt.topic_id'
);
$sql_array['LEFT_JOIN'][] = array(
'FROM' => array(FORUMS_TRACK_TABLE => 'ft'),
'ON' => 'ft.user_id = ' . $user->data['user_id'] . ' AND t.forum_id = ft.forum_id'
);
}
}
if (!$post_id)
{
$sql_array['WHERE'] = "t.topic_id = $topic_id";
}
else
{
$sql_array['WHERE'] = "p.post_id = $post_id AND t.topic_id = p.topic_id";
} LEFT JOIN предотвращает «подцепку» лишних данных и forum_id не переопределяется:Код: Выделить всё
SELECT t.*, f.*, tw.notify_status, bm.topic_id as bookmarked, tt.mark_time, ft.mark_time as forum_mark_time
FROM (phpbb_topics t)
LEFT JOIN phpbb_forums f ON (f.forum_id = t.forum_id)
LEFT JOIN phpbb_topics_watch tw ON (tw.user_id = 2 AND t.topic_id = tw.topic_id)
LEFT JOIN phpbb_bookmarks bm ON (bm.user_id = 2 AND t.topic_id = bm.topic_id)
LEFT JOIN phpbb_topics_track tt ON (tt.user_id = 2 AND t.topic_id = tt.topic_id)
LEFT JOIN phpbb_forums_track ft ON (ft.user_id = 2 AND t.forum_id = ft.forum_id)
WHERE t.topic_id = 2Что скажут Гуру?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
rxu
- phpBB Guru

- Сообщения: 17273
- Стаж: 20 лет 4 месяца
- Откуда: Красноярск
- Благодарил (а): 632 раза
- Поблагодарили: 2413 раз
Re: Сообщаем об ошибках phpBB 3.0.x разработчикам
Каким образом такое может произойти?outta писал(а):Проявляется она при $forum_id == false.
-
outta
- phpBB 1.2.0
- Сообщения: 11
- Стаж: 15 лет 9 месяцев
Re: Сообщаем об ошибках phpBB 3.0.x разработчикам
Приведение типов...
Код: Выделить всё
($forum_id = 0) == falseКод: Выделить всё
($forum_id = NULL) == false-
rxu
- phpBB Guru

- Сообщения: 17273
- Стаж: 20 лет 4 месяца
- Откуда: Красноярск
- Благодарил (а): 632 раза
- Поблагодарили: 2413 раз
Re: Сообщаем об ошибках phpBB 3.0.x разработчикам
outta
Я имел ввиду в коде phpBB. Какой параметр я должен задать в URL, чтобы получить описываемый результат.
Я имел ввиду в коде phpBB. Какой параметр я должен задать в URL, чтобы получить описываемый результат.
-
outta
- phpBB 1.2.0
- Сообщения: 11
- Стаж: 15 лет 9 месяцев
Re: Сообщаем об ошибках phpBB 3.0.x разработчикам
Ты должен опустить параметр
f или указать вместо значения 0.-
rxu
- phpBB Guru

- Сообщения: 17273
- Стаж: 20 лет 4 месяца
- Откуда: Красноярск
- Благодарил (а): 632 раза
- Поблагодарили: 2413 раз
Re: Сообщаем об ошибках phpBB 3.0.x разработчикам
Т.е. опускаю указанный параметр, задаю t= id темы из закрытого форума, и читаю?
Для гостей срабатывает?
Для гостей срабатывает?
-
outta
- phpBB 1.2.0
- Сообщения: 11
- Стаж: 15 лет 9 месяцев
Re: Сообщаем об ошибках phpBB 3.0.x разработчикам
Да, еслиrxu писал(а):Т.е. опускаю указанный параметр, задаю t= id темы из закрытого форума, и читаю?
outta писал(а):имея доступ к первому форуму на конференции (в приведённом примере — к форуму с forum_id = 2)
Да.rxu писал(а):Для гостей срабатывает?
-
rxu
- phpBB Guru

- Сообщения: 17273
- Стаж: 20 лет 4 месяца
- Откуда: Красноярск
- Благодарил (а): 632 раза
- Поблагодарили: 2413 раз
Re: Сообщаем об ошибках phpBB 3.0.x разработчикам
outta
Не воспроизводится. Что я не так делаю?
Добавлено спустя 1 минуту 27 секунд:
У нас есть форум Корзина, закрытый для гостей. Тема 30696, попробуйте и покажите скриншот.
Не воспроизводится. Что я не так делаю?
Добавлено спустя 1 минуту 27 секунд:
У нас есть форум Корзина, закрытый для гостей. Тема 30696, попробуйте и покажите скриншот.
Re: Сообщаем об ошибках phpBB 3.0.x разработчикам
не понимаю, как определить первый форум на конференцииoutta писал(а):имея доступ к первому форуму на конференции (в приведённом примере — к форуму с forum_id = 2)
Т.е. я захожу под админом (имею доступ ко всем форумам) и начинаю перебирать, какой у меня форум вообще первый. Делаю так:
http://мойдомен.ru/viewforum.php?f=1 - заругался "Запрошенного форума не существует."
http://мойдомен.ru/viewforum.php?f=2 - заругался "Запрошенного форума не существует."
...
До тех пор пока он не загрузил первый форум. У меня это метка ид 5. Тут же запоминаю ид темы из скрытого раздела.
Захожу под пользователем. Смотрю. Есть ли у него доступ к форуму с ид 5. Т.е. запускаю так:
http://мойдомен.ru/viewforum.php?f=5.
Работает, открылось. И теперь если я делаю такой запрос из под этого пользователя
http://мойдомен.ru/viewtopic.php?t=ид секретной темы
То тема должна у него открыться? Не открывается.
-
Shredder
- Former team member
- Сообщения: 2266
- Стаж: 17 лет 9 месяцев
- Благодарил (а): 283 раза
- Поблагодарили: 584 раза
Re: Сообщаем об ошибках phpBB 3.0.x разработчикам
В ИЕ8 в окошке настроек прав доступа (любых) какая- то полоса:
В других браузерах нет. Из ИЕ - проверял только восьмой. Подумал сначала, что кривое обновление, но на чистом phpBB всё то же самое.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
rxu
- phpBB Guru

- Сообщения: 17273
- Стаж: 20 лет 4 месяца
- Откуда: Красноярск
- Благодарил (а): 632 раза
- Поблагодарили: 2413 раз
Re: Сообщаем об ошибках phpBB 3.0.x разработчикам
outta
В теперешнем виде этот код находится с 02.07.2006 года, не знаю, каким образом он оказался не таким в вашем случае.
В теперешнем виде этот код находится с 02.07.2006 года, не знаю, каким образом он оказался не таким в вашем случае.
-
outta
- phpBB 1.2.0
- Сообщения: 11
- Стаж: 15 лет 9 месяцев
Re: Сообщаем об ошибках phpBB 3.0.x разработчикам
rxu
Да, действительно, я только что проверил на нескольких дистрибутивах; запрос, который был мной приведён, генерировался изменённым кодом, в блокеотсутствовалочто странно, т.к. в приведённом мной же блоке кода этот кусок есть.
Но всё-таки несмотря на то, что бага с повышением прав нет (кстати, может стоит удалить сообщения, что бы не вводить в заблуждение народ?), сама ошибка в запросе имеется, правда ввиду кода
Да, действительно, я только что проверил на нескольких дистрибутивах; запрос, который был мной приведён, генерировался изменённым кодом, в блоке
Код: Выделить всё
if (!$forum_id)
{
// If it is a global announcement make sure to set the forum id to a postable forum
$sql_array['WHERE'] .= ' OR (t.topic_type = ' . POST_GLOBAL . '
AND f.forum_type = ' . FORUM_POST . ')';
} Код: Выделить всё
t.topic_type = ' . POST_GLOBAL . '
AND Но всё-таки несмотря на то, что бага с повышением прав нет (кстати, может стоит удалить сообщения, что бы не вводить в заблуждение народ?), сама ошибка в запросе имеется, правда ввиду кода
t.topic_type = ' . POST_GLOBAL . ' касается она только глобальных тем. Так, если у посетителя нет прав доступа к первому форуму, то при попытке загрузить глобальную тему без указания параметра f, будет выдан отказ в доступе.-
Shredder
- Former team member
- Сообщения: 2266
- Стаж: 17 лет 9 месяцев
- Благодарил (а): 283 раза
- Поблагодарили: 584 раза
Re: Сообщаем об ошибках phpBB 3.0.x разработчикам
Сообщаем об ошибках phpBB 3.0.x разработчикам
Кстати, переустановил ОС - эта полоса пропала. Странно...
Кстати, переустановил ОС - эта полоса пропала. Странно...
-
rxu
- phpBB Guru

- Сообщения: 17273
- Стаж: 20 лет 4 месяца
- Откуда: Красноярск
- Благодарил (а): 632 раза
- Поблагодарили: 2413 раз
Re: Сообщаем об ошибках phpBB 3.0.x разработчикам
Возможно, просто проблема с рендерингом в браузере (возможно, драйверозависимая).

