1

Тема: "Невозможно подтвердить маркер доступа"

Возникает проблема в свежей инсталляции PunBB 1.3. Невозможно сделать практически ничего: ни войти под админом, ни восстановить пароль оного, ни зарегистрироваться новым пользователем. Во всех случаях — одинаковая ошибка:

Невозможно подтвердить маркер доступа. Возможно, прошло некоторое время после первого входа на страницу и последующей отправкой формы или щелчком по ссылке. Если это так, и вы хотите выполнить своё действие до конца, нажмите кнопку "Подтвердить". Для возврата на исходную страницу нужно нажать кнопку "Отмена".

Если нажать "Подтвердить", страница долго-долго грузится, а потом просто вылетает в ошибку сервера. Если "Отмена", понятное дело, ничего не происходит.

Что может быть? В Гугле чего-то по этому поводу ничего не нашлось...

Поделиться

2

Re: "Невозможно подтвердить маркер доступа"

Вот блин, аналагичная ошибка. Я уже где-то писал об этом.
Мне написали что у всех все нормально.
Ну я плюнул. Причем на многих компах такая же проблема. sad

Поделиться

3

Re: "Невозможно подтвердить маркер доступа"

Смотрите ф-ию csrf_confirm_form() в functions.php.

Моя сборка FluxBB 1.5 * Parserus - BBCode parser

Поделиться

4

Re: "Невозможно подтвердить маркер доступа"

Ошибка маркера доступа возникает, когда вы открываете несколько страниц, и потом отвечаете/меняете не в последней открытой странице - это связано с тем, что маркер меняется от страницы к странице, открыв новую страницу маркер с предыдущей теряет актуальность.
Ошибка сервера - это ошибка сервера, ошибки бывают разные, у них есть конкретные коды и описания.

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

5

Re: "Невозможно подтвердить маркер доступа"

Olhado пишет:

Возникает проблема в свежей инсталляции PunBB 1.3. Невозможно сделать практически ничего: ни войти под админом, ни восстановить пароль оного, ни зарегистрироваться новым пользователем. Во всех случаях — одинаковая ошибка...
Если нажать "Подтвердить", страница долго-долго грузится, а потом просто вылетает в ошибку сервера...

Я думаю проблема с URL-реврайтом на сервере

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

6 (11.02.2009 19:57 отредактировано Olhado)

Re: "Невозможно подтвердить маркер доступа"

Техподдержка хостинга сказала вот что: http://www.host.ru/tips/39

Нужно добавить строки

$SERVER_PORT = 80;
$_SERVER["SERVER_PORT"] = 80;

в config.php

Но это только половина решения проблемы. Да, теперь работает кнопка "Подтвердить" и даже можно умудриться залогинится. Но стоит перейти на другую страницу, авторизация тут же пропадает, к тому же — ошибка о потерянном маркере все равно каждый раз появляется.

Важное замечания: я не возвращаюсь на предыдущие страницы перед тем, как проводить в них заполнения формы, а делаю все "правильно". То есть, маркеру этому на самом деле теряться нет повода.

Видать, что-то в хостинге. Буду его трясти...

Поделиться

7

Re: "Невозможно подтвердить маркер доступа"

Так-с. В общем, решение нашлось, но люди с офф. форума говорят, что это "decreasing your security"…

При отключении проверки этого маркера логин больше не пропадает и все, вроде, работает. Скажите, насколько же этого плохо — иметь эту проверку отключенной?

Поделиться

8 (11.02.2009 23:16 отредактировано artoodetoo)

Re: "Невозможно подтвердить маркер доступа"

теоретически не очень плохо smile

было бы плохо, если БЫ в движке были места, где личные данные сохраняются методом GET (как принято например в vkontakte). тогда была БЫ неслабая вероятность, что тебе подсунут специальную говно-ссылку  и она от твоего имени что-то запишет.

насколько я знаю в PunBB нет врожденных проблем с csrf. вобщем маловероятно, что тебя поимеют. разве что без токена ты разлогиниться не сможешь, либо наоборот по ссылке сходишь и получишь logout smile это некритично.

P.S. ничего не гарантирую. если что, я не виноват!!! smile
P.P.S. плохо, что ты в принципе решаешь проблемы ТАКИМ образом

выполню сложную работу, от $10/час - пишите в ЛС. рефссылка: VPS за $5/мес. бонус за регистрацию $10.

Сайт artoodetoo

Поделиться

9

Re: "Невозможно подтвердить маркер доступа"

P.P.S. плохо, что ты в принципе решаешь проблемы ТАКИМ образом

Посоветуйте альтернативу, я только рад буду решить ДРУГИМ способом smile

Просто форум, который мне предстоит сделать, будет предназначен для очень небольшой категории интернет-граждан (вообще, практически, для внутреннего пользования), так что я решил, что если данное преобразование, решив проблему функционирования движка на хосте, не принесет серьезных ущербов безопасности, то почему бы им не воспользоваться. Учитывая то, что в тех. плане я подкован слабо и вряд ли смогу успешно решить проблему более изящно.

Поделиться

10 (12.02.2009 04:22 отредактировано rondob)

Re: "Невозможно подтвердить маркер доступа"

hcs пишет:

Ошибка маркера доступа возникает, когда вы открываете несколько страниц, и потом отвечаете/меняете не в последней открытой странице - это связано с тем, что маркер меняется от страницы к странице, открыв новую страницу маркер с предыдущей теряет актуальность.

А как можно это исправить? Я пытаюсь интегрировать форум в свой сайт/движок вот таким образом:

<?php
define('FORUM_ROOT', 'forum/');
require FORUM_ROOT.'include/common.php';


if ($forum_user['is_guest']) {    // Guest user
echo 'You are not logged in. Please <a href="forum/login.php">login</a> or <a href="forum/register.php">register</a>.';
        }
       
else {
echo forum_htmlencode($forum_user['username']).'<br>'; // Username
        echo $forum_user['id'].'<br>';                        // User ID
        echo generate_form_token('logout'.$forum_user['id']).'<br>'; // User logout token
       
        echo '<a href="forum/login.php?action=out&id='.$forum_user['id'].'&csrf_token='.generate_form_token('logout'.$forum_user['id']).'">Logout</a>'; // Logout link
        }
?>

Но когда отправляю данные из формы (чтобы добавить их в БД) на странице где этот код расположен, выходит ошибка (причем, она появляется даже если я не залогинен на форуме, и отправляю форму):

Невозможно подтвердить маркер доступа. Возможно, прошло некоторое время после первого входа на страницу и последующей отправкой формы или щелчком по ссылке. Если это так, и вы хотите выполнить своё действие до конца, нажмите кнопку "Подтвердить". Для возврата на исходную страницу нужно нажать кнопку "Отмена".

Получается, что моя страница где вставлен код интеграции имеет уже другой токен? Как можно это исправить?

Поделиться

11

Re: "Невозможно подтвердить маркер доступа"

Вопрос к знатокам:
В версии 1.3 проверка подлинности значительно отличается от того что предлагал artoodetoo применительно к ф-ии confirm_referrer для версии 1.2 у себя на сайте?

Моя сборка FluxBB 1.5 * Parserus - BBCode parser

Поделиться

12

Re: "Невозможно подтвердить маркер доступа"

отличается значительно. проверка стоит в одном месте. в этом есть плюсы и минусы. история вопроса здесь. к сожалению новые хозяева punbb почистили блог, а там было хорошее обсуждение.

выполню сложную работу, от $10/час - пишите в ЛС. рефссылка: VPS за $5/мес. бонус за регистрацию $10.

Сайт artoodetoo

Поделиться

13

Re: "Невозможно подтвердить маркер доступа"

artoodetoo пишет:

отличается значительно. проверка стоит в одном месте. в этом есть плюсы и минусы.

что-то не нашел где это стоит... подскажите пожалуйста!

Поделиться

14 (12.02.2009 20:11 отредактировано artoodetoo)

Re: "Невозможно подтвердить маркер доступа"

include/common.php

// If we're an administrator or moderator, make sure the CSRF token in $_POST is valid (token in post.php is dealt with in post.php)
if (!empty($_POST) && (isset($_POST['confirm_cancel']) || (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== generate_form_token(get_current_url()))) && !defined('FORUM_SKIP_CSRF_CONFIRM'))
    csrf_confirm_form();

Как известно, модуль common подключается на каждой страничке. т.о. проверка описана в одном месте, а защищает все формы, отправленные методом POST.

Разработчики о вас позаботились smile Но вы можете на это забить и закомментировать этот блок или отключить защиту на отдельных страницах: через объявление константы FORUM_SKIP_CSRF_CONFIRM до подключения common.

Это я объясняю для Visman. Так работает защита форм.

В примере rondob нет никакой формы! Только ссылка на logout. А это совсем не одно и то же!
Формы нет, но rondob пишет:

когда отправляю данные из формы (чтобы добавить их в БД) на странице где этот код расположен, выходит ошибка

Где сама форма? Наверное В ФОРМЕ ты не указал маркер доступа, отсюда и ошибка.

выполню сложную работу, от $10/час - пишите в ЛС. рефссылка: VPS за $5/мес. бонус за регистрацию $10.

Сайт artoodetoo

Поделиться

15

Re: "Невозможно подтвердить маркер доступа"

artoodetoo пишет:

Где сама форма? Наверное В ФОРМЕ ты не указал маркер доступа, отсюда и ошибка.

Спасибо за поддержку! Вот пример файла "forum_test.php" с формой и описанием (ниже):

<?php
define('FORUM_ROOT', 'forum/');
require FORUM_ROOT.'include/common.php';

if ($forum_user['is_guest']) {    // Guest user
echo 'You are not logged in. Please <a href="forum/login.php">login</a> or <a href="forum/register.php">register</a>.';
        
echo'<html>
<head>
<title>Forum test</title>
</head>
<body>

<p><form action="forum_test.php" method="POST">
Testfield <input type="text" name="testfield" value="" size="20" /> <br>';
echo '<input type="hidden" name="csrf_token" value="'.$forum_user['csrf_token'].'" /><br>';
echo '<input type="submit" value="Submit" />
</form></p>
</body>
</html>';
}
        
else {
    echo forum_htmlencode($forum_user['username']).'<br>'; // Username
        echo $forum_user['id'].'<br>';                        // User ID
        echo generate_form_token('logout'.$forum_user['id']).'<br>'; // User logout token
        echo $forum_user['csrf_token'].'<br>';
        //echo generate_form_token($forum_page['form_action']).'<br>';
        
        echo '<a href="forum/login.php?action=out&id='.$forum_user['id'].'&csrf_token='.generate_form_token('logout'.$forum_user['id']).'">Logout</a><br>'; // Logout link


echo'<html>
<head>
<title>Forum test</title>
</head>
<body>

<p><form action="forum_test.php" method="POST">
Testfield <input type="text" name="testfield" value="" size="20" /> <br>';
echo '<input type="hidden" name="csrf_token" value="'.$forum_user['csrf_token'].'" /><br>';
echo '<input type="submit" value="Submit" />
</form></p>
</body>
</html>';
}

echo '<br><br><a href="forum/viewtopic.php?id=1">Back</a>';
?>

Ситуация такая: Форма отображается когда вы авторизованы на форуме, и когда вы гость.
Запускаю этот пример (файл "forum_test.php"), в поле формы "csrf_token" генерируется токен, открываю таблицу "punbb_online" БД форума, токен сгенерированный в форме, и записанный в БД сходятся, поле "logged" меняется(!) при каждой перезагрузки файла "forum_test.php".

Нажимаю на своей форме "Submit", появляется сообщение форума:

Unable to confirm security token. A likely cause for this is that some time passed between when you first entered the page and when you submitted a form or clicked a link. If that is the case and you would like to continue with your action, please click the Confirm button. Otherwise, you should click the Cancel button to return to where you were.

Смотрю HTML-код страницы этого сообщения, поле "csrf_token" имеет уже совсем другое value, отличное от того, которое мы передавали. Это значение токена (из формы со страницы с сообщением форума) НЕ СОВПАДАЕТ с записью в таблице "punbb_online" БД форума, в таблице оно осталось неизменным.

Нажимаю "Confirm", загружается файл "forum_test.php", токен в таблице БД, и в моей форме остался неизменным.

Протестируйте пожалуйста этот пример у себя. Очень нужно разобраться с этим! Спасибо за вашу поддержку.

Поделиться

16

Re: "Невозможно подтвердить маркер доступа"

artoodetoo
Ясно.
Я твой алгоритм в свое время поставил на 1.2 себе и доболен wink

Моя сборка FluxBB 1.5 * Parserus - BBCode parser

Поделиться

17

Re: "Невозможно подтвердить маркер доступа"

Спасибо artoodetoo! Натолкнул на мысль использовать token ДЛЯ ФОРМЫ:

echo '<input type="hidden" name="csrf_token" value="'.generate_form_token(get_current_url()).'" /><br>';

Вместо моего токена для юзера:

echo '<input type="hidden" name="csrf_token" value="'.$forum_user['csrf_token'].'" /><br>';

После этого ошибка форума исчезла. Спасибо всем огромное за помощь и поддержку!!!!

Добавлено спустя 36 минут 44 секунды:

Маленький вопрос, насколько критично, если убрать 'login=1' из строки #114: forum/login.php

redirect(forum_htmlencode($_POST['redirect_url']).((substr_count($_POST['redirect_url'], '?') == 1) ? '&amp;' : '?').'login=1', $lang_login['Login redirect']);

Сейчас после того как юзер авторизован, и переадресован на главную страницу, URL выглядит как: http://www.domain.com/forum/?login=1  Насколько критично избавиться от 'login=1' в URL?

Поделиться

18

Re: "Невозможно подтвердить маркер доступа"

Решил эту проблему указанием полного адреса в $base_url вместе с доменом в congif.php.
Было:

$base_url = '/forum';

стало:

$base_url = 'http://'.$_SERVER['HTTP_HOST'].'/forum';

Поделиться

19

Re: "Невозможно подтвердить маркер доступа"

У меня такая же проблема, но решить не могу. Токен generate_form_token(get_current_url()) прописал в форме. При отправке, предупреждение появляется, но только вначале. Дальше всё работает хорошо только до следующего перелогина.

Добавлено спустя 36 минут 8 секунд:

Извините, сам разобрался. В форме был указан лишний слеш в адресе.

Поделиться

20

Re: "Невозможно подтвердить маркер доступа"

Столкнулся с такой же проблемой в версии 1.4.2. Причем несколько месяцев все было нормально, ничего не делал и вдруг началось это... Почитав данный топик, залез в файл config.php и отредактировал таким образом:

Было:

// Disable forum CSRF checking by removing // from the following line
//define('FORUM_DISABLE_CSRF_CONFIRM', 1);

Стало:

// Disable forum CSRF checking by removing // from the following line
define('FORUM_DISABLE_CSRF_CONFIRM', 1);

Т.е. убрал // перед нижней строчкой. Это мне помогло, но все ли я нормально сделал и почему вдруг появилась такая проблема на моем форуме?

Поделиться

21

Re: "Невозможно подтвердить маркер доступа"

Up. Ответьте, плиз...

Поделиться

22

Re: "Невозможно подтвердить маркер доступа"

AntonioBB, возможно токен в форме не доходит до скрипта по каким-нибудь причинам или целевой url формы на основании которого формируется токен изменяется (может что-то в схеме url неверно). Это мои предположения.

Моя сборка FluxBB 1.5 * Parserus - BBCode parser

Поделиться

23

Re: "Невозможно подтвердить маркер доступа"

Visman, как перевести это на язык нуба? Что такое токен?

Поделиться

24

Re: "Невозможно подтвердить маркер доступа"

AntonioBB, маркер доступа и есть токен.

Моя сборка FluxBB 1.5 * Parserus - BBCode parser

Поделиться

25

Re: "Невозможно подтвердить маркер доступа"

да поди базовый урл с www. клиент заходит по адресу без www, ему генерируется под этот адрес токен, а ссылка в меню или  в форме подставляется с www, в результате ошибка токена.

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться