Skip to content
This repository was archived by the owner on Jan 13, 2022. It is now read-only.

Commit 8f65adc

Browse files
committed
Merge pull request #372 from facebook/gFosco.csrf2
Updated FacebookRedirectLoginHelper and SignedRequest ...
2 parents e3f5645 + 2ed50e1 commit 8f65adc

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

src/Facebook/Entities/SignedRequest.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -324,8 +324,18 @@ public static function validateSignature($hashedSig, $sig)
324324
*/
325325
public static function validateCsrf(array $data, $state)
326326
{
327-
if (isset($data['state']) && $data['state'] === $state) {
328-
return;
327+
if (isset($data['state'])) {
328+
$savedLen = strlen($state);
329+
$givenLen = strlen($data['state']);
330+
if ($savedLen == $givenLen) {
331+
$result = 0;
332+
for ($i = 0; $i < $savedLen; $i++) {
333+
$result |= ord($state[$i]) ^ ord($data['state'][$i]);
334+
}
335+
if ($result === 0) {
336+
return;
337+
}
338+
}
329339
}
330340

331341
throw new FacebookSDKException(

src/Facebook/FacebookRedirectLoginHelper.php

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,21 @@ public function getSessionFromRedirect()
203203
*/
204204
protected function isValidRedirect()
205205
{
206-
return $this->getCode() && isset($_GET['state'])
207-
&& $_GET['state'] == $this->state;
206+
$savedState = $this->getCode();
207+
if (!$this->getCode() || !isset($_GET['state'])) {
208+
return false;
209+
}
210+
$givenState = $_GET['state'];
211+
$savedLen = mb_strlen($savedState);
212+
$givenLen = mb_strlen($givenState);
213+
if ($savedLen !== $givenLen) {
214+
return false;
215+
}
216+
$result = 0;
217+
for ($i = 0; $i < $savedLen; $i++) {
218+
$result |= ord($savedState[$i]) ^ ord($givenState[$i]);
219+
}
220+
return $result === 0;
208221
}
209222

210223
/**

0 commit comments

Comments
 (0)