Files
edu/bbs/login.php
T

135 lines
4.7 KiB
PHP

<?php
declare(strict_types=1);
require_once __DIR__ . '/db_conn.php';
require_once __DIR__ . '/auth.php';
edu_start_session();
if (($_SERVER['REQUEST_METHOD'] ?? 'GET') !== 'POST') {
header('Location: /skin/login.php');
exit;
}
$redirect = trim((string) ($_POST['redirect'] ?? '/skin/index.php'));
if ($redirect === '' || strpos($redirect, '/') !== 0) {
$redirect = '/skin/index.php';
}
$memberIdInput = trim((string) ($_POST['member_id'] ?? ''));
$passwordInput = trim((string) ($_POST['intra_pw'] ?? ''));
$sysCompCode = trim((string) ($_POST['sys_comp_code'] ?? ''));
//개발편의 : 임의셋팅 : 오픈후 삭제
// if (strtoupper($memberIdInput) === '12') {
// $memberIdInput = "U001";
// $passwordInput = "baron3840";
// }
if ($memberIdInput === '' || $passwordInput === '' || $sysCompCode === '') {
$back = '/skin/login.php?error=' . rawurlencode('회사코드, ID, 비밀번호를 모두 입력해 주세요.')
. '&redirect=' . rawurlencode($redirect)
. '&member_id=' . rawurlencode($memberIdInput)
. '&sys_comp_code=' . rawurlencode($sysCompCode);
header('Location: ' . $back);
exit;
}
try {
$pdo = db_conn();
$stmt = $pdo->prepare(
"SELECT *
FROM edu_users
WHERE member_id = ?
AND sys_comp_code = ?
LIMIT 1"
);
$stmt->execute([$memberIdInput, $sysCompCode]);
$user = $stmt->fetch(PDO::FETCH_ASSOC) ?: null;
$storedPw = trim((string) ($user['intra_pw'] ?? ''));
$verified = $user && ($storedPw !== '') && hash_equals($storedPw, $passwordInput);
if (!$verified) {
$back = '/skin/login.php?error=' . rawurlencode('ID 또는 비밀번호가 올바르지 않습니다.')
. '&redirect=' . rawurlencode($redirect)
. '&member_id=' . rawurlencode($memberIdInput)
. '&sys_comp_code=' . rawurlencode($sysCompCode);
header('Location: ' . $back);
exit;
}
// 세션 초기화 후 세션 지정
$_SESSION = []; // 기존 세션 데이터 전체 초기화
session_regenerate_id(true); // 새 세션 ID 발급 (세션 고정 공격 방지)
$_SESSION['member_id'] = (string) $user['member_id'];
$_SESSION['sys_comp_code'] = (string) ($user['sys_comp_code'] ?? '');
$_SESSION['belong_comp'] = (string) ($user['belong_comp'] ?? '');
$_SESSION['working_comp'] = (string) ($user['working_comp'] ?? '');
$_SESSION['member_name'] = (string) ($user['name'] ?? '');
$_SESSION['auth_level'] = (string) ($user['auth_level'] ?? 0);
// Keep the full edu_users row in session for cross-page use (password excluded).
unset($user['intra_pw']);
$_SESSION['edu_user'] = $user;
$_SESSION['edu_user_all'] = $user;
foreach ($user as $field => $value) {
$_SESSION['edu_user_' . $field] = $value;
}
$_SESSION['edu_login'] = '1';
$_SESSION['edu_login_at'] = date('Y-m-d H:i:s');
// 2026-04-02 권오재 추가.--- [추가: 접속 이력 프로시저 호출] ---
// 1. 정보 수집
$ip_address = $_SERVER['REMOTE_ADDR'];
$user_agent = $_SERVER['HTTP_USER_AGENT'];
// OS 및 디바이스 판별 (간단한 예시)
$os_name = 'Unknown OS';
if (preg_match('/windows|win32/i', $user_agent))
$os_name = 'Windows';
else if (preg_match('/macintosh|mac os x/i', $user_agent))
$os_name = 'Mac OS';
else if (preg_match('/android/i', $user_agent))
$os_name = 'Android';
else if (preg_match('/iphone/i', $user_agent))
$os_name = 'iOS';
$device_type = (preg_match('/mobile|android|iphone|ipad/i', $user_agent)) ? 'Mobile' : 'PC';
// 브라우저명 추출
$browser_name = 'Unknown Browser';
if (strpos($user_agent, 'MSIE') !== FALSE || strpos($user_agent, 'Trident') !== FALSE)
$browser_name = 'IE';
else if (strpos($user_agent, 'Edge') !== FALSE)
$browser_name = 'Edge';
else if (strpos($user_agent, 'Chrome') !== FALSE)
$browser_name = 'Chrome';
else if (strpos($user_agent, 'Firefox') !== FALSE)
$browser_name = 'Firefox';
else if (strpos($user_agent, 'Safari') !== FALSE)
$browser_name = 'Safari';
// 2. 프로시저 실행
$stmtLog = $pdo->prepare("CALL proc_insert_edu_access_log(?, ?, ?, ?, ?, ?)");
$stmtLog->execute([
$_SESSION['member_id'],
$_SESSION['sys_comp_code'],
$ip_address,
$os_name,
$device_type,
$browser_name
]);
header('Location: ' . $redirect);
exit;
} catch (Throwable $e) {
$back = '/skin/login.php?error=' . rawurlencode('로그인 처리 중 오류가 발생했습니다.')
. '&redirect=' . rawurlencode($redirect)
. '&member_id=' . rawurlencode($memberIdInput);
header('Location: ' . $back);
exit;
}