• 01-02-2025, 17:09:08
    #1
    Gold üye
    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>
  • 01-02-2025, 17:15:51
    #2
    if (!isset($_SESSION['logged_in'])) {
        header('Location: index.php');
        exit();
    }
    Dashboard sayfasında oturum kontrolü var lakin login kısmında (index.php) logged_in session'u oluşturulmuyor..
  • 01-02-2025, 17:25:33
    #3
    Gold üye
    Teşekkürler yardım için evet burası
  • 01-02-2025, 17:26:47
    #4
    Rica ederim