86 $token = bin2hex(random_bytes(32));
87 }
catch (Exception $e) {
88 Util::logError(
'Failed to generate CSRF token: ' . $e->getMessage());
90 $token = hash(
'sha256', uniqid(
'bearsampp_csrf_',
true) . microtime(
true));
94 $_SESSION[self::SESSION_KEY][$token] = time();
97 if (count($_SESSION[self::SESSION_KEY]) > self::MAX_TOKENS) {
99 $oldestToken = array_key_first($_SESSION[self::SESSION_KEY]);
100 unset($_SESSION[self::SESSION_KEY][$oldestToken]);
144 public static function validateToken($token, $removeAfterValidation =
false)
149 if (empty($token) || !is_string($token)) {
155 if (!isset($_SESSION[self::SESSION_KEY][$token])) {
161 $tokenTimestamp = $_SESSION[self::SESSION_KEY][$token];
162 if (time() - $tokenTimestamp > self::TOKEN_EXPIRATION) {
164 unset($_SESSION[self::SESSION_KEY][$token]);
172 if ($removeAfterValidation) {
173 unset($_SESSION[self::SESSION_KEY][$token]);
189 if (isset($_POST[
'csrf_token'])) {
194 if (isset($_GET[
'csrf_token'])) {
202 foreach ($headers as $key => $value) {
203 if (strtolower($key) ===
'x-csrf-token') {
221 if (function_exists(
'getallheaders')) {
222 $headers = getallheaders();
223 if ($headers !==
false) {
230 foreach ($_SERVER as $key => $value) {
232 if (substr($key, 0, 5) ===
'HTTP_') {
234 $headerName = str_replace(
' ',
'-', ucwords(strtolower(str_replace(
'_',
' ', substr($key, 5)))));
235 $headers[$headerName] = $value;
238 elseif (in_array($key, [
'CONTENT_TYPE',
'CONTENT_LENGTH'])) {
239 $headerName = str_replace(
' ',
'-', ucwords(strtolower(str_replace(
'_',
' ', $key))));
240 $headers[$headerName] = $value;