Подтверждения при массовом удалении работают неправильно
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение
).
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение
-
VEG
- phpBB 2.0.7a
- Сообщения: 609
- Стаж: 20 лет 5 месяцев
- Откуда: Минск
- Благодарил (а): 20 раз
- Поблагодарили: 141 раз
Подтверждения при массовом удалении работают неправильно
Возле каждого сообщения есть кнопка «Удалить». Допустим, я хочу удалить 3 сообщения из темы. Открываю 3 ссылки «Удалить» средней кнопкой мыши (открывается 3 вкладки с адресами вида http://slutsk.net/forum/posting.php?mod ... 9&p=100039), потом прохожусь по трем этим вкладкам и нажимаю там «Да», чем подтверждаю что я хочу удалить эти сообщения. НО! Удаляется только то сообщение, окно удаления которого я вызвал последним, в остальных же мне говорит «Извините, но вы можете удалять только ваши собственные сообщения». Когда же я удаляю все эти сообщения по одному, то все ок.
Пробовал на чистом phpBB3.0.2 без модов — эффект тот же.
Неужели это фича?
Добавлено спустя 15 минут 33 секунды:
При подтверждении передаются такие параметры:
posting.php?mode=delete&f=55&p=98604&confirm_key=4VR5XAMNHZ
Здесь очень интересен параметр confirm_key. Как я понимаю, он генерируется для каждого удаления свой, а в базе хранится только последний сгенерированный код подтверждения удаления. Я так понимаю, это сделано для того, чтобы усложнить удаление сообщений ботом. Спорная фича. Из-за этого появляется сильное неудобство с удалением сообщений. Может кто-нибудь писал мод, чтобы хранилось много ключей подтверждения (неограниченно, удалять их по времени).
Пробовал на чистом phpBB3.0.2 без модов — эффект тот же.
Неужели это фича?
Добавлено спустя 15 минут 33 секунды:
При подтверждении передаются такие параметры:
posting.php?mode=delete&f=55&p=98604&confirm_key=4VR5XAMNHZ
Здесь очень интересен параметр confirm_key. Как я понимаю, он генерируется для каждого удаления свой, а в базе хранится только последний сгенерированный код подтверждения удаления. Я так понимаю, это сделано для того, чтобы усложнить удаление сообщений ботом. Спорная фича. Из-за этого появляется сильное неудобство с удалением сообщений. Может кто-нибудь писал мод, чтобы хранилось много ключей подтверждения (неограниченно, удалять их по времени).
Последний раз редактировалось VEG 19.07.2008 15:08, всего редактировалось 1 раз.
phpBBex 1.7.1 — phpBB 3 с уникальными функциями, не существующими в модах
phpBB [ media ] — универсальный bbcode для вставки аудио и видео (поддержка более 30 сервисов, без правок кода)
phpBB [ media ] — универсальный bbcode для вставки аудио и видео (поддержка более 30 сервисов, без правок кода)
-
FladeX
- Former team member
- Сообщения: 1935
- Стаж: 19 лет 3 месяца
- Откуда: Саранск
- Благодарил (а): 7 раз
- Поблагодарили: 59 раз
Re: Удаление нескольких сообщений кнопкой «Удалить» не работает
То есть в каждой вкладке браузера отмечено одно сообщение? 
//
// Okay, let's do the loop, yeah come on baby let's do the loop
// and it goes like this ...
| phpBB Adept ] | Каталог форумов | генератор sitemap для форумов | форум про форумы
// Okay, let's do the loop, yeah come on baby let's do the loop
// and it goes like this ...
| phpBB Adept ] | Каталог форумов | генератор sitemap для форумов | форум про форумы
-
VEG
- phpBB 2.0.7a
- Сообщения: 609
- Стаж: 20 лет 5 месяцев
- Откуда: Минск
- Благодарил (а): 20 раз
- Поблагодарили: 141 раз
Re: Удаление нескольких сообщений кнопкой «Удалить» не работает
Нет. Разные сообщения. Пример. Открываются ссылки (в этом порядке):
http://slutsk.net/forum/posting.php?mod ... 55&p=98444
http://slutsk.net/forum/posting.php?mod ... 55&p=98446
http://slutsk.net/forum/posting.php?mod ... 55&p=98451
http://slutsk.net/forum/posting.php?mod ... 55&p=98455
Теперь в каком бы порядке я не нажимал в этих окнах кнопку «Да», удалится сообщение только по последней ссылке, а во всех остальных мне скажет, что я могу удалять только свои сообщения.
Попробуйте на своем форуме. Эффект должен быть тот же.
http://slutsk.net/forum/posting.php?mod ... 55&p=98444
http://slutsk.net/forum/posting.php?mod ... 55&p=98446
http://slutsk.net/forum/posting.php?mod ... 55&p=98451
http://slutsk.net/forum/posting.php?mod ... 55&p=98455
Теперь в каком бы порядке я не нажимал в этих окнах кнопку «Да», удалится сообщение только по последней ссылке, а во всех остальных мне скажет, что я могу удалять только свои сообщения.
Попробуйте на своем форуме. Эффект должен быть тот же.
phpBBex 1.7.1 — phpBB 3 с уникальными функциями, не существующими в модах
phpBB [ media ] — универсальный bbcode для вставки аудио и видео (поддержка более 30 сервисов, без правок кода)
phpBB [ media ] — универсальный bbcode для вставки аудио и видео (поддержка более 30 сервисов, без правок кода)
-
izstas
- phpBB 1.4.4
- Сообщения: 112
- Стаж: 19 лет 6 месяцев
- Откуда: Елец
- Поблагодарили: 2 раза
-
VEG
- phpBB 2.0.7a
- Сообщения: 609
- Стаж: 20 лет 5 месяцев
- Откуда: Минск
- Благодарил (а): 20 раз
- Поблагодарили: 141 раз
Re: Подтверждения при массовом удалении работают неправильно
Похоже, это проблема всех скриптов форума, где есть удаление. Например, в панели администратора смайлики удаляются тоже с confirm_key, то есть если я открою удаление сразу 3 смайликов, удалится только последний.
Что за фигня?
Кто-нибудь в баг-репорты отправит?
Добавлено спустя 10 минут 42 секунды:
Похоже, что этот confirm_key один на пользователя. Открываю окно удаления сообщения, затем открываю окно удаления смайла. Кликаю подтверждение удаления сообщения — оно не удаляется.
Добавлено спустя 8 минут 13 секунд:
В таблице пользователей есть поле user_last_confirm_key — сюда записывается одно последнее значение confirm_key.
К счастью, за всю эту ерунду отвечает одна функция confirm_box в functions.php — ее и нужно править, чтобы решить проблему. Кто-нибудь занимался этим?
Сейчас я могу предложить простое решение:Оно отключает эту багофичу. Но хотелось бы лучшее решение, когда эти коды подтверждения все же использовались, но для хранения кодов использовалась бы дополнительная таблица. Попробую заняться этим вечером.
Что за фигня?
Кто-нибудь в баг-репорты отправит?
Добавлено спустя 10 минут 42 секунды:
Похоже, что этот confirm_key один на пользователя. Открываю окно удаления сообщения, затем открываю окно удаления смайла. Кликаю подтверждение удаления сообщения — оно не удаляется.
Добавлено спустя 8 минут 13 секунд:
В таблице пользователей есть поле user_last_confirm_key — сюда записывается одно последнее значение confirm_key.
К счастью, за всю эту ерунду отвечает одна функция confirm_box в functions.php — ее и нужно править, чтобы решить проблему. Кто-нибудь занимался этим?
Сейчас я могу предложить простое решение:
Код: Выделить всё
OPEN includes/functions.php
FIND
if ($user_id != $user->data['user_id'] || $session_id != $user->session_id || !$confirm_key || !$user->data['user_last_confirm_key'] || $confirm_key != $user->data['user_last_confirm_key'])
REPLACE
if ($user_id != $user->data['user_id'] || $session_id != $user->session_id || !$confirm_key)phpBBex 1.7.1 — phpBB 3 с уникальными функциями, не существующими в модах
phpBB [ media ] — универсальный bbcode для вставки аудио и видео (поддержка более 30 сервисов, без правок кода)
phpBB [ media ] — универсальный bbcode для вставки аудио и видео (поддержка более 30 сервисов, без правок кода)
-
izstas
- phpBB 1.4.4
- Сообщения: 112
- Стаж: 19 лет 6 месяцев
- Откуда: Елец
- Поблагодарили: 2 раза
Re: Подтверждения при массовом удалении работают неправильно
На phpbb.com нашёл тему, правда по двойке - вроде бы это таблица CAPTCH'и. Так что придётся делать отдельную таблицу.
-
VEG
- phpBB 2.0.7a
- Сообщения: 609
- Стаж: 20 лет 5 месяцев
- Откуда: Минск
- Благодарил (а): 20 раз
- Поблагодарили: 141 раз
Re: Подтверждения при массовом удалении работают неправильно
Сделал. Как и хотелось — для каждого пользователя сохраняется неограниченное количество кодов подтверждения, каждый код хранится 15 минут, после чего становится недействительным и удаляется из базы.
Что у меня получилось вы видите ниже. Если не будет обнаружено проблем — оформлю в виде мода.
Может быть стоит отправить разработчикам phpbb? По мне так ляп очень неприятный, для пользователя выглядит как баг, хотя это и особенность реализации. Исправить нужно обязательно.
Внимание! В коде комментарии на русском языке, чтобы все работало сохраняйте php файл в UTF-8 без BOM или удалите комментарии
SQL
OPEN
FIND
ADD AFTER
OPEN
FIND
REPLACE
FIND
REPLACE
Что у меня получилось вы видите ниже. Если не будет обнаружено проблем — оформлю в виде мода.
Может быть стоит отправить разработчикам phpbb? По мне так ляп очень неприятный, для пользователя выглядит как баг, хотя это и особенность реализации. Исправить нужно обязательно.
Внимание! В коде комментарии на русском языке, чтобы все работало сохраняйте php файл в UTF-8 без BOM или удалите комментарии
SQL
Код: Выделить всё
CREATE TABLE IF NOT EXISTS `phpbb_user_confirm_keys` (
`confirm_key` varchar(10) NOT NULL,
`user_id` mediumint(8) NOT NULL,
`confirm_time` int(11) NOT NULL,
PRIMARY KEY (`confirm_key`),
KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;Код: Выделить всё
includes/constants.phpКод: Выделить всё
// Additional tablesКод: Выделить всё
define('USER_CONFIRM_KEYS_TABLE', $table_prefix . 'user_confirm_keys');Код: Выделить всё
includes/functions.phpКод: Выделить всё
if ($check && $confirm)
{
$user_id = request_var('user_id', 0);
$session_id = request_var('sess', '');
$confirm_key = request_var('confirm_key', '');
if ($user_id != $user->data['user_id'] || $session_id != $user->session_id || !$confirm_key || !$user->data['user_last_confirm_key'] || $confirm_key != $user->data['user_last_confirm_key'])
{
return false;
}
// Reset user_last_confirm_key
$sql = 'UPDATE ' . USERS_TABLE . " SET user_last_confirm_key = ''
WHERE user_id = " . $user->data['user_id'];
$db->sql_query($sql);
return true;
}Код: Выделить всё
// Удаляем из базы ключи, которым больше 15 минут
$sql = "DELETE FROM " . USER_CONFIRM_KEYS_TABLE . "
WHERE confirm_time < " . (time() - 900);
$db->sql_query($sql);
if ($check && $confirm)
{
$user_id = request_var('user_id', 0);
$session_id = request_var('sess', '');
$confirm_key = request_var('confirm_key', '');
if ($user_id != $user->data['user_id'] || $session_id != $user->session_id || !$confirm_key) return false;
// Проверяем, есть ли предоставленный ключ подтверждения в базе
$sql = "SELECT * FROM " . USER_CONFIRM_KEYS_TABLE . "
WHERE user_id = " . $user->data['user_id'] . " AND confirm_key = '" . $db->sql_escape($confirm_key) . "'";
$result = $db->sql_query($sql);
if(!$db->sql_fetchrow($result)) return false;
// Удаляем использованный ключ
$sql = "DELETE FROM " . USER_CONFIRM_KEYS_TABLE . "
WHERE user_id = " . $user->data['user_id'] . " AND confirm_key = '" . $db->sql_escape($confirm_key) . "'";
$db->sql_query($sql);
return true;
}Код: Выделить всё
$sql = 'UPDATE ' . USERS_TABLE . " SET user_last_confirm_key = '" . $db->sql_escape($confirm_key) . "'
WHERE user_id = " . $user->data['user_id'];
$db->sql_query($sql);Код: Выделить всё
// Записываем новый ключ подтверждения в таблицу
$data = array(
'confirm_key' => $confirm_key,
'user_id' => (int) $user->data['user_id'],
'confirm_time' => (int) time(),
);
$sql = 'INSERT INTO ' . USER_CONFIRM_KEYS_TABLE . ' ' . $db->sql_build_array('INSERT', $data);
$db->sql_query($sql);
Последний раз редактировалось VEG 10.08.2008 8:30, всего редактировалось 1 раз.
phpBBex 1.7.1 — phpBB 3 с уникальными функциями, не существующими в модах
phpBB [ media ] — универсальный bbcode для вставки аудио и видео (поддержка более 30 сервисов, без правок кода)
phpBB [ media ] — универсальный bbcode для вставки аудио и видео (поддержка более 30 сервисов, без правок кода)
-
VEG
- phpBB 2.0.7a
- Сообщения: 609
- Стаж: 20 лет 5 месяцев
- Откуда: Минск
- Благодарил (а): 20 раз
- Поблагодарили: 141 раз
Re: Подтверждения при массовом удалении работают неправильно
Вот что пишут авторы phpbb по этому поводу
Даже на такую мелочь нужно делать мод
У них паранойя. Такой простой вещью они сильно снижают удобство управления большим форумом. Кто-нибудь может привести пример, где можно в нехороших целях использовать то, что можно одновременно делать подтверждения нескольким действиям?Acyd Burn писал(а):The confirm box is a secure way of requesting an action - due to it's mechanism you are only able to confirm one action at a time, once another confirm box is opened all previous "confirmations" become invalid - this is to protect the admin to not being tricked into performing any malicious action.
I suggest you do not let the confirm box open - effectively skipping your second step.
Даже на такую мелочь нужно делать мод
phpBBex 1.7.1 — phpBB 3 с уникальными функциями, не существующими в модах
phpBB [ media ] — универсальный bbcode для вставки аудио и видео (поддержка более 30 сервисов, без правок кода)
phpBB [ media ] — универсальный bbcode для вставки аудио и видео (поддержка более 30 сервисов, без правок кода)

