Merhaba ,

Aşağıdaki index.php kodundan login olduğumda dashboard.php sayfasına yönlendirmiyor. Session taraflarında hata var ama gözümden kaçıyor. İkinci bir göz olarak inceleyebilen olursa sevinirim.

//index.php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Session başlatmadan önce çıktı tamponlamasını başlatalım
ob_start();
// Session ayarlarını session_start()'dan ÖNCE yapıyoruz
ini_set('session.gc_maxlifetime', 1800); // 30 dakika
ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_secure', 1);
ini_set('session.use_only_cookies', 1);
session_start();
require_once 'conf/config.php';
require_once 'conf/security.php';
require_once 'conf/recaptcha_config.php';
// Log fonksiyonunu ekleyelim
function writeLog($message) {
    // Zaman dilimini İstanbul'a göre ayarla
    date_default_timezone_set('Europe/Istanbul');
    
    $logDir = __DIR__ . '/logs';
    $today = date('Y-m-d');
    $logFile = $logDir . '/' . $today . '.log';
    
    // Logs klasörü yoksa oluştur
    if (!file_exists($logDir)) {
        mkdir($logDir, 0755, true);
    }
    
    // Log mesajını GMT+3'e göre hazırla
    $timestamp = date('Y-m-d H:i:s');
    $logMessage = "[{$timestamp}] {$message}" . PHP_EOL;
    
    // Dosyaya yaz
    file_put_contents($logFile, $logMessage, FILE_APPEND);
}
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    try {
        // Giriş denemelerini sınırla
        if (!isset($_SESSION['login_attempts'])) {
            $_SESSION['login_attempts'] = 0;
        }
        
        if (!isset($_SESSION['last_attempt'])) {
            $_SESSION['last_attempt'] = time();
        }
        if ($_SESSION['login_attempts'] >= 5) {
            if (time() - $_SESSION['last_attempt'] < 3) { // 5 dakika bekletme
                writeLog("Çok fazla başarısız deneme. IP: " . $_SERVER['REMOTE_ADDR']);
                throw new Exception("Çok fazla başarısız deneme yaptınız. Lütfen 5 dakika bekleyin.");
            } else {
                // Süre dolmuşsa sayacı sıfırla
                $_SESSION['login_attempts'] = 0;
                $_SESSION['last_attempt'] = time();
            }
        }
        // CSRF kontrolü ekle
        if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
            throw new Exception('CSRF token doğrulaması başarısız!');
        }
        // reCAPTCHA doğrulaması ekle
        if (!isset($_POST['g-recaptcha-response']) || empty($_POST['g-recaptcha-response'])) {
            writeLog("reCAPTCHA yanıtı eksik. IP: " . $_SERVER['REMOTE_ADDR']);
            throw new Exception("Lütfen robot olmadığınızı doğrulayın.");
        }
        $recaptcha_response = $_POST['g-recaptcha-response'];
        $verify_url = "https://www.google.com/recaptcha/api/siteverify";
        $data = [
            'secret' => RECAPTCHA_SECRET_KEY,
            'response' => $recaptcha_response,
            'remoteip' => $_SERVER['REMOTE_ADDR']
        ];
        // CURL kullanarak daha güvenli bir HTTP isteği yap
        $ch = curl_init($verify_url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
        $verify_response = curl_exec($ch);
        
        if (curl_errno($ch)) {
            writeLog("reCAPTCHA doğrulama hatası: " . curl_error($ch));
            throw new Exception("Güvenlik doğrulaması başarısız oldu. Lütfen daha sonra tekrar deneyin.");
        }
        curl_close($ch);
        $captcha_success = json_decode($verify_response);
        if (!$captcha_success->success) {
            writeLog("reCAPTCHA doğrulaması başarısız. IP: " . $_SERVER['REMOTE_ADDR'] . 
                    " Hata kodları: " . json_encode($captcha_success->{"error-codes"}));
            throw new Exception("Robot doğrulaması başarısız oldu. Lütfen tekrar deneyin.");
        }
        // Minimum skor kontrolü (v3 için)
        if (isset($captcha_success->score) && $captcha_success->score < 0.5) {
            writeLog("reCAPTCHA skoru düşük: " . $captcha_success->score . " IP: " . $_SERVER['REMOTE_ADDR']);
            throw new Exception("Güvenlik doğrulaması başarısız oldu. Lütfen tekrar deneyin.");
        }
        $conn = connectDB();
        if (!$conn) {
            throw new Exception("Veritabanı bağlantısı başarısız!");
        }
        $email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            throw new Exception("Geçersiz e-posta formatı!");
        }
        $password = $_POST['password'];
        
        // Kullanıcı kontrolü
        $sql = "SELECT * FROM kullanicilar WHERE Mail = ? AND Sifre = CONVERT(VARBINARY(128), ?)";
        $params = array($email, hashPassword($password));
        
        $stmt = sqlsrv_query($conn, $sql, $params);
        
        if ($stmt === false) {
            writeLog("Sorgu hatası: " . print_r(sqlsrv_errors(), true) . " - IP: " . $_SERVER['REMOTE_ADDR']);
            throw new Exception("Sorgu hatası: " . print_r(sqlsrv_errors(), true));
        }
        
        if (sqlsrv_has_rows($stmt)) {
            // Kullanıcı doğrulandı
            $user = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
            
            // Debug için ekran çıktısı
            error_log("Login successful for user: " . $user['Mail']);
            error_log("User ID: " . $user['ID']);
            
            // Session değişkenlerini ayarla
            $_SESSION['user_id'] = $user['ID'];
            $_SESSION['email'] = $user['Mail'];
            $_SESSION['authenticated'] = true; // Yeni eklenen güvenlik kontrolü
            
            // Session'ı kaydet
            session_regenerate_id(true); // Güvenlik için session ID'yi yenile
            
            // Başarılı giriş logunu yaz
            writeLog("Başarılı giriş - Kullanıcı: " . $user['Mail'] . " - IP: " . $_SERVER['REMOTE_ADDR']);
            
            // Çıktı tamponunu temizle
            ob_end_clean();
            
            // Direkt yönlendirme yap
            header("Location: admin_dashboard.php");
            exit();
        } else {
            // Başarısız giriş
            throw new Exception("Geçersiz email veya şifre!");
        }
    } catch (Exception $e) {
        $error_message = $e->getMessage();
        $_SESSION['login_attempts']++;
        $_SESSION['last_attempt'] = time();
        
        // Hata durumunu logla
        writeLog("Hata: " . $error_message . 
                " - IP: " . $_SERVER['REMOTE_ADDR'] . 
                " - Deneme sayısı: " . $_SESSION['login_attempts']);
    } finally {
        if (isset($conn) && $conn) {
            sqlsrv_close($conn);
        }
    }
}
// CSRF token oluştur
if (!isset($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
?>
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-Content-Type-Options" content="nosniff">
    <meta http-equiv="X-Frame-Options" content="DENY">
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self' https://www.google.com/recaptcha/ https://www.gstatic.com/recaptcha/ 'unsafe-inline'; frame-src https://www.google.com/recaptcha/;">
    <title>Giriş Yap</title>
    <link rel="stylesheet" href="css/login.css?v=<?php echo time(); ?>">
    <link rel="stylesheet" href="fonts/loginpagefont.css?v=<?php echo time(); ?>">
    <script src="https://www.google.com/recaptcha/api.js" async defer></script>
</head>
<body>
<div class="login-container">
    <div class="login-header">
        
    </div>
    <form method="POST" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" autocomplete="off">
        <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
        <?php if (isset($error_message)): ?>
            <div class="error-message" role="alert">
                <?php echo htmlspecialchars($error_message); ?>
            </div>
        <?php endif; ?>
        <div class="form-group">
            <label for="email">E-posta</label>
            <input type="email" 
                   id="email" 
                   name="email" 
                   required 
                   pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$" 
                   autocomplete="username"
                   value="<?php echo isset($_POST['email']) ? htmlspecialchars($_POST['email']) : ''; ?>">
        </div>
        <div class="form-group">
            <label for="password">Şifre</label>
            <input type="password" 
                   id="password" 
                   name="password" 
                   required 
                   minlength="8" 
                   autocomplete="current-password">
        </div>
        <div class="form-group">
            <div class="g-recaptcha" data-sitekey="<?php echo RECAPTCHA_SITE_KEY; ?>"></div>
        </div>
        <button type="submit" class="login-btn">Giriş Yap</button>
    </form>
    <div class="forgot-password">
        <a href="sifremi-unuttum.php">Şifremi Unuttum</a>
    </div>
</div>
</body>
</html>
//dashboard.php
<?php
require_once 'conf/config.php';
session_start();
// Oturum kontrolü
if (!isset($_SESSION['logged_in'])) {
    header('Location: index.php');
    exit();
}
// MSSQL bağlantısı
$conn = connectDB();
if (!$conn) {
    die("Veritabanı bağlantısı başarısız!");
}
// Sorguyu çalıştır ve sonuçları al
try {
    $sql = "SELECT * FROM mfirewall ORDER BY mfirewallid";
    $result = sqlsrv_query($conn, $sql);
    
    if ($result === false) {
        throw new Exception("Sorgu hatası: " . print_r(sqlsrv_errors(), true));
    }
} catch (Exception $e) {
    die("Sorgu başarısız: " . $e->getMessage());
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>F&nbsp;I&nbsp;R&nbsp;E&nbsp;W&nbsp;A&nbsp;L&nbsp;L</title>
    <link rel="stylesheet" href="css/normalize.min.css">
    <link rel="stylesheet" href="css/style.css">
    <script src="js/prefixfree.min.js"></script>
    <style>
        @font-face {
            font-family: 'Centaur';
            src: url('fonts/Centaur.woff2') format('woff2'),
            url('fonts/Centaur.woff') format('woff'),
            url('fonts/Centaur.ttf') format('truetype');
        }
        h1 {
            font-family: 'Centaur', serif;
            font-size: 40px; /* Neon için daha büyük */
            letter-spacing: 0.3em;
            text-align: center;
            color: #ffffff; /* Beyaz renk */
            text-shadow:
                    0 0 10px #ffffff,  /* Daha parlak ve geniş glow efekti */
                    0 0 20px #ffffff,  /* Daha geniş glow efekti */
                    0 0 30px #ffb3ff,  /* Pembe-mor dış hat parlama */
                    0 0 40px #ffb3ff,  /* Uzak pembe parlama */
                    0 0 60px #ff99ff,  /* Daha geniş pembe parlama */
                    0 0 80px #cc33ff;  /* En uzak mor parlama */
            animation: neon-flicker 1.5s infinite alternate; /* Neon flicker animasyonu */
        }
        /* Neon flicker animasyonu */
        @keyframes neon-flicker {
            0% {
                opacity: 1;
                text-shadow:
                        0 0 10px #ffffff,
                        0 0 20px #ffffff,
                        0 0 30px #ffb3ff,
                        0 0 40px #ffb3ff,
                        0 0 60px #ff99ff,
                        0 0 80px #cc33ff;
            }
            50% {
                opacity: 0.9;
                text-shadow:
                        0 0 8px #ffffff,
                        0 0 15px #ffffff,
                        0 0 25px #ffb3ff,
                        0 0 35px #ffb3ff,
                        0 0 55px #ff99ff,
                        0 0 75px #cc33ff;
            }
            100% {
                opacity: 0.8;
                text-shadow:
                        0 0 5px #ffffff,
                        0 0 10px #ffffff,
                        0 0 20px #ffb3ff,
                        0 0 30px #ffb3ff,
                        0 0 50px #ff99ff,
                        0 0 70px #cc33ff;
            }
        }
    </style>
</head>
<body>
    <div>
        <h1>FIREWALL</h1>
        <a href="addfrwmenu.php" style="color: white; font-weight: bold; background-color: transparent; border: 2px solid white; padding: 10px 20px; border-radius: 5px; text-decoration: none; transition: background-color 0.3s;"><b>Ekle<b></a>&nbsp;&nbsp;&nbsp;<a href="logout.php" style="color: white; font-weight: bold; background-color: transparent; border: 2px solid white; padding: 10px 20px; border-radius: 5px; text-decoration: none; transition: background-color 0.3s;"><b>Çıkış<b></a>
        <a:hover {
                 background-color: rgba(255, 255, 255, 0.1);
                 }
    </div>
    <div class="content">
        <br>
        <table width='80%' border=2>
            <tr bgcolor='#CCCCCC'>
                <td><b>IP ADRES</b></td>
                <td><b>PORT</b></td>
                <td><b>ACIKLAMA</b></td>
                <td><b>AKSIYON</b></td>
            </tr>
            <?php
            // Veritabanından gelen sonuçları döngü ile ekrana yazdır
            while ($res = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) {
                echo "<tr>";
                echo "<td style='color: white; font-weight: bold;'>".$res['mfirewallip']."</td>";
                echo "<td style='color: white; font-weight: bold;'>".$res['mfirewallport']."</td>";
                echo "<td style='color: white; font-weight: bold;'>".$res['mfirewalldesc']."</td>";
                echo "<td><a href='delete.php?mfirewallid=".$res['mfirewallid']."' onClick='return confirm(\"Are you sure you want to delete?\")' style='color: white; font-weight: bold; background-color: transparent; border: 1px solid white; padding: 2px 10px; border-radius: 3px; text-decoration: none; font-size: 14px; transition: background-color 0.3s;'>S&nbsp;i&nbsp;l</a></td>";
                echo "</tr>";
            }
            echo "<style>
        a:hover {
            background-color: rgba(255, 255, 255, 0.1);
        }
      </style>";
            ?>
        </table>
    </div>
    <?php
    // Bağlantıyı kapat
    sqlsrv_close($conn);
    ?>
</body>
</html>