'User initiated']); } session_destroy(); header("Location: login.php"); exit(); } // Handle Auto Logout (Timeout) if (isset($_GET['action']) && $_GET['action'] == 'timeout') { if (isset($_SESSION['account'])) { require_once("../core/utils.php"); system_log($conn2, $_SESSION['account'], 'AUTO_LOGOUT', ['reason' => 'Inactivity timeout']); } session_destroy(); header("Location: login.php?error=timeout"); exit(); } // Redirect if already logged in if (!empty($_SESSION['sess_userid']) && $_SESSION['sess_userid'] === session_id()) { header("Location: dashboard.php"); exit(); } $error_msg = ""; if (isset($_GET['error']) && $_GET['error'] === 'timeout') { $error_msg = "เซสชั่นหมดอายุ
เนื่องจากไม่มีการใช้งานระบบเป็นเวลานาน กรุณาล็อกอินใหม่อีกครั้ง"; } if ($_SERVER["REQUEST_METHOD"] == "POST") { require_once("../core/utils.php"); require_once("../inc/rfc6238.php"); // CSRF Check if (!verify_csrf_token($_POST['csrf_token'] ?? '')) { die("CSRF Token Validation Failed"); } $username = $_POST['username'] ?? ''; $password = $_POST['password'] ?? ''; $ip_address = $_SERVER['REMOTE_ADDR']; $otp_arr = $_POST['otp'] ?? []; $otp_val = implode('', $otp_arr); if (empty($username) || empty($password)) { $error_msg = "ข้อมูลไม่ครบถ้วน
กรุณากรอก Username และ Password ให้ครบถ้วน"; } else if (!check_rate_limit($conn2, $ip_address)) { $error_msg = "บัญชีถูกระงับชั่วคราว
ท่านพยายามเข้าสู่ระบบผิดพลาดหลายครั้ง กรุณารอ 15 นาที"; system_log($conn2, $username, 'LOGIN_BLOCKED', ['reason' => 'Rate limit exceeded']); } else { $stmt = $conn1->prepare("SELECT * FROM opduser WHERE loginname = ?"); $stmt->bind_param("s", $username); $stmt->execute(); $result = $stmt->get_result(); $stmt->close(); if ($result->num_rows == 1) { $row = $result->fetch_assoc(); if (isset($row['account_disable']) && $row['account_disable'] === 'Y') { $error_msg = "บัญชีนี้ถูกยกเลิกการใช้งาน
กรุณาติดต่อผู้ดูแลระบบ (Admin) เพื่อขอเปิดสิทธิ์"; system_log($conn2, $username, 'LOGIN_FAILED', ['reason' => 'Account disabled']); } else if (md5($password) === $row['passweb']) { // Check 2FA if user has secret key $secretkey = ''; $stmt2 = $conn2->prepare("SELECT secret_key FROM sys_user_2fa WHERE loginname = ?"); if ($stmt2) { $stmt2->bind_param("s", $username); $stmt2->execute(); $res2 = $stmt2->get_result(); if ($res2->num_rows > 0) { $secretkey = $res2->fetch_assoc()['secret_key']; } $stmt2->close(); } $pass_2fa = true; if (!empty($secretkey)) { if (empty($otp_val)) { $pass_2fa = false; $error_msg = "ตรวจสอบสิทธิ์ล้มเหลว (2FA)
กรุณากรอกรหัสยืนยันตัวตน 6 หลัก จากแอปพลิเคชัน"; system_log($conn2, $username, 'LOGIN_FAILED', ['reason' => 'Missing 2FA code']); record_failed_login($conn2, $ip_address, $username); } else { $pass_2fa = TokenAuth6238::verify($secretkey, $otp_val); if (!$pass_2fa) { $error_msg = "รหัส 2FA ไม่ถูกต้อง
กรุณาตรวจสอบรหัสจาก Google Authenticator และลองอีกครั้ง"; system_log($conn2, $username, 'LOGIN_FAILED', ['reason' => 'Invalid 2FA code']); record_failed_login($conn2, $ip_address, $username); } } } if ($pass_2fa) { session_regenerate_id(); $_SESSION['sess_userid'] = session_id(); $_SESSION['account'] = $row['loginname']; $_SESSION['name'] = $row['name']; $_SESSION['position'] = 'เจ้าหน้าที่'; // simplified $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; $client_os = getOS(); $client_browser = getBrowser(); system_log($conn2, $username, 'LOGIN_SUCCESS', [ 'message' => 'Logged in successfully', 'os' => $client_os, 'browser' => $client_browser ]); clear_failed_logins($conn2, $ip_address); header("Location: dashboard.php"); exit(); } } else { record_failed_login($conn2, $ip_address, $username); $error_msg = "รหัสผ่านไม่ถูกต้อง
กรุณาตรวจสอบตัวสะกด พิมพ์เล็ก/ใหญ่ แล้วลองอีกครั้ง"; system_log($conn2, $username, 'LOGIN_FAILED', ['reason' => 'Invalid password']); } } else { record_failed_login($conn2, $ip_address, $username); $error_msg = "ไม่พบชื่อผู้ใช้งานนี้
ไม่มีชื่อผู้ใช้งานนี้ในระบบ HOSxP กรุณาตรวจสอบ Username อีกครั้ง"; system_log($conn2, $username, 'LOGIN_FAILED', ['reason' => 'Username not found']); } } } ?>
Logo

โรงพยาบาลเกาะสมุย

ระบบฐานข้อมูล HOSxP Data

ระบบมีความปลอดภัยสูง ข้อมูลของท่านได้รับการปกป้อง