File: /home/muratemr/theotto.tr/includes/csrf.php
<?php
/**
* includes/csrf.php
* CSRF token üretme ve doğrulama
*/
declare(strict_types=1);
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
/**
* CSRF token döner (yoksa oluşturur)
*/
function csrf_token(): string
{
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
return $_SESSION['csrf_token'];
}
/**
* Gelen token'ı doğrular
*/
function csrf_verify(string $token = ''): bool
{
if (empty($_SESSION['csrf_token'])) {
return false;
}
// AJAX header'dan veya form alanından al
if ($token === '') {
$token = $_POST['csrf_token']
?? $_SERVER['HTTP_X_CSRF_TOKEN']
?? '';
}
return hash_equals($_SESSION['csrf_token'], $token);
}
/**
* AJAX isteğinde CSRF başarısız olunca JSON hata döndür
*/
function csrf_required(): void
{
$token = $_POST['csrf_token']
?? $_SERVER['HTTP_X_CSRF_TOKEN']
?? '';
if (!csrf_verify($token)) {
http_response_code(403);
echo json_encode(['success' => false, 'message' => 'Geçersiz CSRF token.']);
exit;
}
}
/**
* HTML gizli input üretir
*/
function csrf_input(): string
{
return '<input type="hidden" name="csrf_token" value="' . htmlspecialchars(csrf_token()) . '">';
}