0, 'path' => '/', 'secure' => !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off', 'httponly' => true, 'samesite' => 'Lax', ]); session_start(); } function send_private_no_store_headers(): void { if (headers_sent()) { return; } header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0'); header('Pragma: no-cache'); header('Expires: 0'); header('X-Content-Type-Options: nosniff'); header('Referrer-Policy: same-origin'); } function csrf_token(): string { if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } return $_SESSION['csrf_token']; } function csrf_field(): string { return ''; } function verify_csrf_token(?string $token): bool { return is_string($token) && isset($_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], $token); } function require_valid_csrf_for_post(): void { if (($_SERVER['REQUEST_METHOD'] ?? '') !== 'POST') { return; } if (verify_csrf_token($_POST['csrf_token'] ?? null)) { return; } http_response_code(419); exit('Invalid CSRF token.'); } function enable_csrf_form_injection(): void { if (PHP_SAPI === 'cli' || defined('FINANCIAL_CSRF_INJECTION_ENABLED')) { return; } define('FINANCIAL_CSRF_INJECTION_ENABLED', true); ob_start(static function (string $buffer): string { if ( stripos($buffer, '