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 I R E W A L 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> <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 i 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>