Skip to content

Commit 3677852

Browse files
committed
Regenerate session id when
changing the current user to avoid session fixation.
1 parent 1b99d91 commit 3677852

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

src/Parse/ParseUser.php

+4
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,10 @@ protected function handleSaveResult($makeCurrent = false)
500500
unset($this->serverData['sessionToken']);
501501
}
502502
if ($makeCurrent) {
503+
if (session_id()) {
504+
// see: https://www.owasp.org/index.php/Session_fixation
505+
session_regenerate_id();
506+
}
503507
static::$currentUser = $this;
504508
static::saveCurrentUser();
505509
}
+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
namespace Parse\Test;
3+
4+
use Parse\ParseClient;
5+
use Parse\ParseUser;
6+
use Parse\ParseSession;
7+
8+
class ParseSessionFixationTest extends \PHPUnit_Framework_TestCase
9+
{
10+
11+
public static function setUpBeforeClass()
12+
{
13+
Helper::clearClass(ParseUser::$parseClassName);
14+
Helper::clearClass(ParseSession::$parseClassName);
15+
ParseUser::logout();
16+
ParseClient::_unsetStorage();
17+
18+
// indicate we should not use cookies
19+
ini_set("session.use_cookies", 0);
20+
// indicate we can use something other than cookies
21+
ini_set("session.use_only_cookies", 0);
22+
// enable transparent sid support, for url based sessions
23+
ini_set("session.use_trans_sid", 1);
24+
// clear cache control for session pages
25+
ini_set("session.cache_limiter", "");
26+
session_start();
27+
Helper::setUp();
28+
}
29+
30+
public function tearDown()
31+
{
32+
Helper::tearDown();
33+
Helper::clearClass(ParseUser::$parseClassName);
34+
Helper::clearClass(ParseSession::$parseClassName);
35+
ParseUser::logout();
36+
}
37+
38+
public static function tearDownAfterClass()
39+
{
40+
session_destroy();
41+
}
42+
43+
public function testCookieIdChangedForAnonymous()
44+
{
45+
ParseClient::getStorage()->set('test', 'hi');
46+
$noUserSessionId = session_id();
47+
$user = ParseUser::loginWithAnonymous();
48+
$anonymousSessionId = session_id();
49+
$this->assertNotEquals($noUserSessionId, $anonymousSessionId);
50+
$this->assertEquals(ParseClient::getStorage()->get('test'), 'hi');
51+
$user->logout();
52+
}
53+
54+
public function testCookieIdChangedForAnonymousToRegistered()
55+
{
56+
$user = ParseUser::loginWithAnonymous();
57+
$anonymousSessionId = session_id();
58+
ParseClient::getStorage()->set('test', 'hi');
59+
$user->setUsername('testy');
60+
$user->setPassword('testy');
61+
$user->save();
62+
$user->login('testy', 'testy');
63+
$registeredSessionId = session_id();
64+
$this->assertNotEquals($anonymousSessionId, $registeredSessionId);
65+
$this->assertEquals(ParseClient::getStorage()->get('test'), 'hi');
66+
}
67+
}

0 commit comments

Comments
 (0)