Ошибка 404 в быстрых ответах.

#1 18 марта 2013 в 22:22
Стоит версия двига 1.10.1 — при попытке ответить в форуме в поле "быстрый ответ" при нажатии на кнопку "отправить" перекидывает на страницу ошибки про адресу сайт.ру/forum/reply88.html
Не могу понять в чем проблемс. У кого нибудь такое было?
#2 18 марта 2013 в 22:28
Да, такое тоже было, я подумал только у меня. Приходится возвращаться назад и снова нажимать кнопку отправить.
#3 18 марта 2013 в 22:35
Как-то решил эту проблему?
#4 18 марта 2013 в 22:59
проверьте файлы шаблонов форума и сравните с дефолтными…
#5 18 мая 2013 в 19:11
Аналогичная проблема, причем изменений никаких не было в шаблоне. Распишите подробно что и где смотреть
#6 18 мая 2013 в 23:37
Эту проблему где-то уже обсуждали на форуме и вроде даже решение было. Суть то ли в сессяих, то ли в куки… Если открываешь сайт в нескольких вкладках, то это основной форумный глюк. Кстати, тоже надо бы у себя поправить…
#7 19 мая 2013 в 09:42
AndroS, было бы не плохо ссылку на тему, а то поиск ничего не дал. Да, видимо из за вкладок проблема, надо проверить еще.
#8 19 мая 2013 в 15:10
Оффшор, нашел-таки, с горем пополам!
#9 19 мая 2013 в 21:23
AndroS,

Есть не очень сложное решение (только для 404 ошибки при нескольких открытых вкладках).
Нужно модифицировать 2 файла.
1. /core/cms.php
строки 3063-3075
Код PHP:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Проверяет значение сессии в POST и сравнивает с текущим
* @return bool
*/
public static function validateForm(){

if(!@$_POST['csrf_token']) { return false; }
if($_POST['csrf_token'] == cmsUser::getCsrfToken()) { return true; }
return false;

}
заменить/дополнить на
Код PHP:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Проверяет значение сессии в POST и сравнивает с текущим
* @return bool
*/
public static function validateForm(){

if(!@$_POST['csrf_token']) { return false; }
//if($_POST['csrf_token'] == cmsUser::getCsrfToken()) { return true; }
if(cmsUser::checkCsrfToken($_POST['csrf_token'] )) { return true; }
return false;

}
public static function generateRandomString($length = 32,$onlyDigitandAlfa = true) {
$chars = 'abcdefghjiklmopqnrstuvwxyzACBDEFGIJHKLMNOPQRSUVWXTYZ0123456789';
if (!$onlyDigitandAlfa) {
$chars.='*.-~';
}
$numChars = strlen($chars)-1;
$string = '';

for ($i = 0; $i < $length; $i++) {
$string .= $chars{mt_rand(0, $numChars)} ;
}
return $string;
}
2. /core/classes/user.class.php
строки 1607-1621
Код PHP:
// ============================================================================ //
// ============================================================================ //
public static function getCsrfToken(){

$csrf_token = self::sessionGet('csrf_token', 'security');
if($csrf_token) { return $csrf_token; }

return self::sessionPut('csrf_token', md5(uniqid().rand(0, 9999)), 'security');

}
public static function clearCsrfToken(){

return self::sessionDel('csrf_token', 'security');

}
заменить на
Код PHP:
// ============================================================================ //
// ============================================================================ //
public static function getCsrfToken(){

//$csrf_token = self::sessionGet('csrf_token', 'security');
//if($csrf_token) { return $csrf_token; }

//return self::sessionPut('csrf_token', md5(uniqid().rand(0, 9999)), 'security');
return self::genCsrfToken(self::genCsrfTokenId());
}
public static function checkCsrfToken($csrf_token){
$tokenId=substr($csrf_token,0,6);
$controlToken=self::genCsrfToken($tokenId);
if ($controlToken==$csrf_token){
$csrf_tokens = self::sessionGet('csrf_token', 'security');
if (!is_array($csrf_tokens)){
$csrf_tokens=array();
}
$csrf_tokens[$tokenId]=time();
self::sessionPut('csrf_token', $csrf_tokens, 'security');
return true;
}
return false;
}
public static function clearCsrfToken(){

//return self::sessionDel('csrf_token', 'security');

}
public static function genCsrfToken($tokenId){
return $tokenId. md5($tokenId. session_id(). 'sekret key');
}
public static function existCsrfTokenId($tokenId){
$csrf_tokens = self::sessionGet('csrf_token', 'security');
if (isset($csrf_tokens[$tokenId])){
if (time() — $csrf_tokens[$tokenId] >24*3600 ) {
unset($csrf_tokens[$tokenId]);
self::sessionPut('csrf_token', $csrf_tokens, 'security');
return false;
}
return true;
}
return false;
}

public static function genCsrfTokenId(){
$tokenId=cmsCore::generateRandomString(6);
while(self::existCsrfTokenId($tokenId))
{
$tokenId=cmsCore::generateRandomString(6);
}
return $tokenId;
}

Цена: для каждого сообщения пользователя в течении сессии скрипт сохраняет 6 символьный код. Т.е. если у вас есть пользователи оставляющие пару тысяч реальных сообщений в течении сессии, то скрипт может серьезно подгрузить сервер. Мои пользователи больше 15 сообщений в день не генерируют!
Я так понял решение вот это?
#10 19 мая 2013 в 21:34
Оффшор, возможно, я не экспериментировал еще, так как потребность возникла недавно, а тему эту нашел, потому что видел ее раньше :)
#11 20 мая 2013 в 14:15
да проблема существует. периодически (не каждый раз) при первой попытке отправить сообщение через быстрый ответ — 404.
кстати сейчас пытался смоделировать эту ситуацию чтобы посмотреть какую страницу он запрашивает в этих ситуациях из 10 попыток-ни одной ошибки roflно на днях наполнял форум по делу и в каждой теме выскакивала ошибка.
Как вариант решения проблемы — убрать форму быстрого ответа и сделать более видимой кнопку "Написать". Через полную форму ответа ошибки вроде не бывает.
#12 20 мая 2013 в 17:55
Нил, Как вариант попробовать решение из темы и сообщить о результатах. По этому ждём ответов
#13 20 мая 2013 в 20:19

Через полную форму ответа ошибки вроде не бывает.

Нил
Бывает и при нажатии на Ответить…
#14 17 января 2014 в 14:16
На 1.10.3 такая же беда. Если отвечать в быстром ответе более N-ного количества времени (точное время не засекал), то вываливается 404. Спасает кнопка браузера "Назад", но это не выход. Предложенный выше метод не подходит, ибо он для 1.10.1 и вообще для другого случая. У кого есть такая же бага и кто как победил?
#15 3 июня 2014 в 16:54

На 1.10.3 такая же беда. Если отвечать в быстром ответе более N-ного количества времени (точное время не засекал), то вываливается 404. Спасает кнопка браузера "Назад", но это не выход. Предложенный выше метод не подходит, ибо он для 1.10.1 и вообще для другого случая. У кого есть такая же бага и кто как победил?

Put In
у меня такая же бага, версия 1.10.2… когда пишут большие посты, проходит много времени… и бац ошибка 404
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.