Не могу понять в чем проблемс. У кого нибудь такое было?
Нужно модифицировать 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 попыток-ни одной ошибки но на днях наполнял форум по делу и в каждой теме выскакивала ошибка.
Как вариант решения проблемы — убрать форму быстрого ответа и сделать более видимой кнопку "Написать". Через полную форму ответа ошибки вроде не бывает.
Бывает и при нажатии на Ответить…Через полную форму ответа ошибки вроде не бывает.
у меня такая же бага, версия 1.10.2… когда пишут большие посты, проходит много времени… и бац ошибка 404На 1.10.3 такая же беда. Если отвечать в быстром ответе более N-ного количества времени (точное время не засекал), то вываливается 404. Спасает кнопка браузера "Назад", но это не выход. Предложенный выше метод не подходит, ибо он для 1.10.1 и вообще для другого случая. У кого есть такая же бага и кто как победил?