diff --git a/adm/admin.lib.php b/adm/admin.lib.php index 58336b576..8bc521e2d 100644 --- a/adm/admin.lib.php +++ b/adm/admin.lib.php @@ -617,13 +617,12 @@ if (!$member['mb_id']) { } } -// 관리자의 아이피, 브라우저와 다르다면 세션을 끊고 관리자에게 메일을 보낸다. -$admin_key = md5($member['mb_datetime'] . get_real_client_ip() . $_SERVER['HTTP_USER_AGENT']); -if (get_session('ss_mb_key') !== $admin_key) { - +// 관리자의 클라이언트를 검증하여 일치하지 않으면 세션을 끊고 관리자에게 메일을 보낸다. +if (!verify_mb_key($member)) { session_destroy(); include_once G5_LIB_PATH . '/mailer.lib.php'; + // 메일 알림 mailer($member['mb_nick'], $member['mb_email'], $member['mb_email'], 'XSS 공격 알림', $_SERVER['REMOTE_ADDR'] . ' 아이피로 XSS 공격이 있었습니다.

관리자 권한을 탈취하려는 접근이므로 주의하시기 바랍니다.

해당 아이피는 차단하시고 의심되는 게시물이 있는지 확인하시기 바랍니다.' . G5_URL, 0); diff --git a/bbs/login_check.php b/bbs/login_check.php index ea654f3f7..3882f38c0 100644 --- a/bbs/login_check.php +++ b/bbs/login_check.php @@ -71,8 +71,9 @@ if (! (defined('SKIP_SESSION_REGENERATE_ID') && SKIP_SESSION_REGENERATE_ID)) { // 회원아이디 세션 생성 set_session('ss_mb_id', $mb['mb_id']); -// FLASH XSS 공격에 대응하기 위하여 회원의 고유키를 생성해 놓는다. 관리자에서 검사함 - 110106 -set_session('ss_mb_key', md5($mb['mb_datetime'] . get_real_client_ip() . $_SERVER['HTTP_USER_AGENT'])); +// FLASH XSS 공격에 대응하기 위하여 회원의 고유키를 생성해 놓는다. 관리자에서 검사함 +generate_mb_key($mb); + // 회원의 토큰키를 세션에 저장한다. /common.php 에서 해당 회원의 토큰값을 검사한다. if(function_exists('update_auth_session_token')) update_auth_session_token($mb['mb_datetime']); diff --git a/lib/common.lib.php b/lib/common.lib.php index edf06a002..f05c8e30b 100644 --- a/lib/common.lib.php +++ b/lib/common.lib.php @@ -2266,6 +2266,53 @@ function check_token() return true; } +/** + * 브라우저 검증을 위한 세션 반환 및 재생성 + * @param array $member 로그인 된 회원의 정보. 가입일시(mb_datetime)를 반드시 포함해야 한다. + * @param bool $regenerate true 이면 재생성 + * @return string + */ +function ss_mb_key($member, $regenerate = false) +{ + $client_key = ($regenerate) ? null : get_cookie('mb_client_key'); + + if (!$client_key) { + $client_key = get_random_token_string(16); + set_cookie('mb_client_key', $client_key, G5_SERVER_TIME * -1); + } + + $mb_key = md5($member['mb_datetime'] . $client_key) . md5($_SERVER['HTTP_USER_AGENT']); + + return $mb_key; +} + +/** + * 회원의 클라이언트 검증 + * @param array $member 로그인 된 회원의 정보. 가입일시(mb_datetime)를 반드시 포함해야 한다. + * @return bool + */ +function verify_mb_key($member) +{ + $mb_key = ss_mb_key($member); + $verified = get_session('ss_mb_key') === $mb_key; + + if (!$verified) { + ss_mb_key($member, true); + } + + return $verified; +} + +/** + * 회원의 클라이언트 검증 키 생성 + * 클라이언트 키를 다시 생성하여 생성된 키는 `ss_mb_key` 세션에 저장됨 + * @param array $member 로그인 된 회원의 정보. 가입일시(mb_datetime)를 반드시 포함해야 한다. + */ +function generate_mb_key($member) +{ + $mb_key = ss_mb_key($member, true); + set_session('ss_mb_key', $mb_key); +} // 문자열에 utf8 문자가 들어 있는지 검사하는 함수 // 코드 : http://in2.php.net/manual/en/function.mb-check-encoding.php#95289