diff --git a/bbs/login_check.php b/bbs/login_check.php index 38b2165427..3942e91e52 100644 --- a/bbs/login_check.php +++ b/bbs/login_check.php @@ -64,6 +64,8 @@ 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'])); +// 회원의 토큰키를 세션에 저장한다. /common.php 에서 해당 회원의 토큰값을 검사한다. +if(function_exists('update_auth_session_token')) update_auth_session_token($mb['mb_datetime']); // 포인트 체크 if($config['cf_use_point']) { diff --git a/bbs/register_form_update.php b/bbs/register_form_update.php index 4374c6566d..0cfbaddf59 100644 --- a/bbs/register_form_update.php +++ b/bbs/register_form_update.php @@ -303,8 +303,10 @@ } // 메일인증 사용하지 않는 경우에만 로그인 - if (!$config['cf_use_email_certify']) + if (!$config['cf_use_email_certify']) { set_session('ss_mb_id', $mb_id); + if(function_exists('update_auth_session_token')) update_auth_session_token(G5_TIME_YMDHIS); + } set_session('ss_mb_reg', $mb_id); diff --git a/common.php b/common.php index 4d167beb83..964e71b070 100644 --- a/common.php +++ b/common.php @@ -505,8 +505,8 @@ function session_start_samesite($options = array()) if (isset($_SESSION['ss_mb_id']) && $_SESSION['ss_mb_id']) { // 로그인중이라면 $member = get_member($_SESSION['ss_mb_id']); - // 차단된 회원이면 ss_mb_id 초기화 - if($member['mb_intercept_date'] && $member['mb_intercept_date'] <= date("Ymd", G5_SERVER_TIME)) { + // 차단된 회원이면 ss_mb_id 초기화, 또는 세션에 저장된 회원 토큰값을 비교하여 틀리면 초기화 + if( ($member['mb_intercept_date'] && $member['mb_intercept_date'] <= date("Ymd", G5_SERVER_TIME)) || (function_exists('check_auth_session_token') && !check_auth_session_token($member['mb_datetime'])) ) { set_session('ss_mb_id', ''); $member = array(); } else { @@ -529,7 +529,7 @@ function session_start_samesite($options = array()) $tmp_mb_id = substr(preg_replace("/[^a-zA-Z0-9_]*/", "", $tmp_mb_id), 0, 20); // 최고관리자는 자동로그인 금지 if (strtolower($tmp_mb_id) !== strtolower($config['cf_admin'])) { - $sql = " select mb_password, mb_intercept_date, mb_leave_date, mb_email_certify from {$g5['member_table']} where mb_id = '{$tmp_mb_id}' "; + $sql = " select mb_password, mb_intercept_date, mb_leave_date, mb_email_certify, mb_datetime from {$g5['member_table']} where mb_id = '{$tmp_mb_id}' "; $row = sql_fetch($sql); if($row['mb_password']){ $key = md5($_SERVER['SERVER_ADDR'] . $_SERVER['SERVER_SOFTWARE'] . $_SERVER['HTTP_USER_AGENT'] . $row['mb_password']); @@ -542,6 +542,7 @@ function session_start_samesite($options = array()) (!$config['cf_use_email_certify'] || preg_match('/[1-9]/', $row['mb_email_certify'])) ) { // 세션에 회원아이디를 저장하여 로그인으로 간주 set_session('ss_mb_id', $tmp_mb_id); + if(function_exists('update_auth_session_token')) update_auth_session_token($row['mb_datetime']); // 페이지를 재실행 echo ""; diff --git a/install/install_db.php b/install/install_db.php index 397c0cea92..f51a5d6885 100644 --- a/install/install_db.php +++ b/install/install_db.php @@ -569,6 +569,7 @@ fwrite($f, "define('G5_MYSQL_DB', '".addcslashes($mysql_db, "\\'")."');\n"); fwrite($f, "define('G5_MYSQL_SET_MODE', {$mysql_set_mode});\n\n"); fwrite($f, "define('G5_TABLE_PREFIX', '{$table_prefix}');\n\n"); +fwrite($f, "define('G5_TOKEN_ENCRYPTION_KEY', '".bin2hex(random_bytes(16))."'); // 토큰 암호화에 사용할 키\n\n"); fwrite($f, "\$g5['write_prefix'] = G5_TABLE_PREFIX.'write_'; // 게시판 테이블명 접두사\n\n"); fwrite($f, "\$g5['auth_table'] = G5_TABLE_PREFIX.'auth'; // 관리권한 설정 테이블\n"); fwrite($f, "\$g5['config_table'] = G5_TABLE_PREFIX.'config'; // 기본환경 설정 테이블\n"); diff --git a/lib/common.lib.php b/lib/common.lib.php index 8ef590f654..968db53587 100644 --- a/lib/common.lib.php +++ b/lib/common.lib.php @@ -3924,6 +3924,23 @@ function is_include_path_check($path='', $is_input='') return true; } +function check_auth_session_token($str=''){ + if (get_session('ss_mb_token_key') === get_token_encryption_key($str)) { + return true; + } + return false; +} + +function update_auth_session_token($str=''){ + set_session('ss_mb_token_key', get_token_encryption_key($str)); +} + +function get_token_encryption_key($str=''){ + $token = G5_GNUBOARD_VER.(defined('G5_YOUNGCART_VER') ? G5_YOUNGCART_VER : '').G5_TABLE_PREFIX.(defined('G5_SHOP_TABLE_PREFIX') ? G5_SHOP_TABLE_PREFIX : '').(defined('G5_TOKEN_ENCRYPTION_KEY') ? G5_TOKEN_ENCRYPTION_KEY : '').$str; + + return md5($token); +} + function filter_input_include_path($path){ return str_replace('//', '/', $path); } diff --git a/plugin/social/register_member_update.php b/plugin/social/register_member_update.php index 4981031dfd..2c61e2a8bc 100644 --- a/plugin/social/register_member_update.php +++ b/plugin/social/register_member_update.php @@ -226,6 +226,7 @@ //바로 로그인 처리 set_session('ss_mb_id', $mb['mb_id']); + if(function_exists('update_auth_session_token')) update_auth_session_token(G5_TIME_YMDHIS); } else { // 메일인증을 사용한다면 $subject = '['.$config['cf_title'].'] 인증확인 메일입니다.';