фиксация сессии в Joomla 2.5

Воздействие, которое это может вызвать: Можно украсть или манипулировать сеансом клиента и файлами cookie, которые могут использоваться для олицетворения законного пользователя, позволяя хакеру просматривать или изменять записи пользователя и выполнять транзакции от имени этого пользователя.

И рекомендуемое решение для предотвращения атак с фиксацией сеанса заключается в обновлении идентификатора сеанса при входе пользователя в систему. Это исправление может быть выполнено на уровне кода или инфраструктуры, в зависимости от того, где реализована функциональность управления сеансом.

Я пытаюсь найти решение для этого, и все же я не добился успеха. Кто-нибудь может помочь, как это исправить в Joomla 2.5?

Я хочу реализовать это исправление на уровне фреймворка. Любая помощь будет оценена.

1

Решение

Я сделал это для версии Joomla 3.x. Это должно быть похоже на 2.5.
Вы должны изменить 2 файла, чтобы сделать эту работу.

  1. библиотеки / CMS / приложение / cms.php

  2. библиотеки / Joomla / сессия / session.php

в cms.php измените функцию входа

 // Import the user plugin group.
JPluginHelper::importPlugin('user');

if ($response->status === JAuthentication::STATUS_SUCCESS)
{
$session = &JFactory::getSession();
// we fork the session to prevent session fixation issues
$session->fork();

/*
* Validate that the user should be able to login (different to being authenticated).
* This permits authentication plugins blocking the user.
*/
$authorisations = $authenticate->authorise($response, $options);

в session.php измените функцию fork (), чтобы включить

function fork()
{
if( $this->_state !== 'active' ) {
// @TODO :: generated error here
return false;
}

// save values
$values = $_SESSION;

// keep session config
/*$trans        =       ini_get( 'session.use_trans_sid' );
if( $trans ) {
ini_set( 'session.use_trans_sid', 0 );
} */
$cookie =       session_get_cookie_params();
// create new session id
//$id   =       $this->_createId( strlen( $this->getId() ) );
session_regenerate_id(true);
$id = session_id();

// first we grab the session data
$data = $this->_store->read($this->getId());

// kill session
session_destroy();

// re-register the session store after a session has been destroyed, to avoid PHP bug
$this->_store->register();

// restore config
ini_set( 'session.use_trans_sid', $trans );
session_set_cookie_params($cookie['lifetime'], $cookie['path'], $cookie['domain'], $cookie['secure'], true);

// restart session with new id
session_id( $id );
//session_regenerate_id(true);
session_start();
$_SESSION = $values;

//now we put the session data back
$this->_store->write($id, $data);
return true;
}
0

Другие решения

Большое спасибо @ryadavalli! Это очень полезно. Используя предложенное вами решение, я решил его для Joomla 2.5.

Только несколько изменений; для Joomla 2.5 код должен быть помещен в

  1. библиотеки / Joomla / приложение / application.php
  2. библиотеки / Joomla / сессия / session.php

В application.php W.r.t ваше решение

public function login($credentials, $options = array())
{
// Get the global JAuthentication object.
jimport('joomla.user.authentication');

$authenticate = JAuthentication::getInstance();
$response = $authenticate->authenticate($credentials, $options);

// Import the user plugin group.
JPluginHelper::importPlugin('user');

if ($response->status === JAuthentication::STATUS_SUCCESS)
{
$session = &JFactory::getSession();
// we fork the session to prevent session fixation issues
$session->fork();
// validate that the user should be able to login (different to being authenticated)
// this permits authentication plugins blocking the user
$authorisations = $authenticate->authorise($response, $options);

В session.php, обновил код следующим образом

public function fork()
{
if ($this->_state !== 'active')
{
// @TODO :: generated error here
return false;
}

// Save values
$values = $_SESSION;

// Keep session config
/*$trans = ini_get('session.use_trans_sid');
if ($trans)
{
ini_set('session.use_trans_sid', 0);
} */
$cookie = session_get_cookie_params();

// Create new session id
//$id = $this->_createId();

session_regenerate_id(true);
$id = session_id();

// first we grab the session data
$data = $this->_store->read();

// Kill session
session_destroy();

// Re-register the session store after a session has been destroyed, to avoid PHP bug
$this->_store->register();

// Restore config
ini_set('session.use_trans_sid', $trans);
session_set_cookie_params($cookie['lifetime'], $cookie['path'], $cookie['domain'], $cookie['secure']);

// Restart session with new id
session_id($id);
session_start();

$_SESSION = $values;

//now we put the session data back
$this->_store->write($id, $data);

return true;
}
0

По вопросам рекламы [email protected]