@@ -208,7 +208,8 @@ function sql_escape_string($str)
208
208
@ini_set ("session.use_trans_sid " , 0 ); // PHPSESSID를 자동으로 넘기지 않음
209
209
@ini_set ("url_rewriter.tags " ,"" ); // 링크에 PHPSESSID가 따라다니는것을 무력화함 (해뜰녘님께서 알려주셨습니다.)
210
210
211
- session_save_path (G5_SESSION_PATH );
211
+ // 세션파일 저장 디렉토리를 지정할 경우
212
+ // session_save_path(G5_SESSION_PATH);
212
213
213
214
if (isset ($ SESSION_CACHE_LIMITER ))
214
215
@session_cache_limiter ($ SESSION_CACHE_LIMITER );
@@ -232,8 +233,15 @@ function chrome_domain_session_name(){
232
233
'.maru.net ' , // 마루호스팅
233
234
);
234
235
235
- if (isset ($ _SERVER ['HTTP_HOST ' ]) && preg_match ('/( ' .implode ('| ' , $ domain_array ).')/i ' , $ _SERVER ['HTTP_HOST ' ])){ // 위의 도메인주소를 포함한 url접속시 기본세션이름을 변경한다.
236
- if (! defined ('G5_SESSION_NAME ' )) define ('G5_SESSION_NAME ' , 'G5PHPSESSID ' );
236
+ $ add_str = '' ;
237
+ $ document_root_path = str_replace ('\\' , '/ ' , realpath ($ _SERVER ['DOCUMENT_ROOT ' ]));
238
+
239
+ if ( G5_PATH !== $ document_root_path ){
240
+ $ add_str = substr_count (G5_PATH , '/ ' ).basename (dirname (__FILE__ ));
241
+ }
242
+
243
+ if ($ add_str || (isset ($ _SERVER ['HTTP_HOST ' ]) && preg_match ('/( ' .implode ('| ' , $ domain_array ).')/i ' , $ _SERVER ['HTTP_HOST ' ])) ){ // 위의 도메인주소를 포함한 url접속시 기본세션이름을 변경한다.
244
+ if (! defined ('G5_SESSION_NAME ' )) define ('G5_SESSION_NAME ' , 'G5 ' .$ add_str .'PHPSESSID ' );
237
245
@session_name (G5_SESSION_NAME );
238
246
}
239
247
}
@@ -243,8 +251,18 @@ function chrome_domain_session_name(){
243
251
if ( ! class_exists ('XenoPostToForm ' ) ){
244
252
class XenoPostToForm
245
253
{
254
+ public static function g5_session_name (){
255
+ return (defined ('G5_SESSION_NAME ' ) && G5_SESSION_NAME ) ? G5_SESSION_NAME : 'PHPSESSID ' ;
256
+ }
257
+
258
+ public static function php52_request_check (){
259
+ $ cookie_session_name = self ::g5_session_name ();
260
+ if (isset ($ _REQUEST [$ cookie_session_name ]) && $ _REQUEST [$ cookie_session_name ] != session_id ())
261
+ goto_url (G5_BBS_URL .'/logout.php ' );
262
+ }
263
+
246
264
public static function check () {
247
- $ cookie_session_name = ( defined ( ' G5_SESSION_NAME ' ) && G5_SESSION_NAME ) ? G5_SESSION_NAME : ' PHPSESSID ' ;
265
+ $ cookie_session_name = self :: g5_session_name () ;
248
266
249
267
return !isset ($ _COOKIE [$ cookie_session_name ]) && count ($ _POST ) && ((isset ($ _SERVER ['HTTP_REFERER ' ]) && !preg_match ('~^https:// ' .preg_quote ($ _SERVER ['HTTP_HOST ' ], '~ ' ).'/~ ' , $ _SERVER ['HTTP_REFERER ' ]) || ! isset ($ _SERVER ['HTTP_REFERER ' ]) ));
250
268
}
@@ -351,8 +369,9 @@ function session_start_samesite($options = array())
351
369
352
370
$ headers = headers_list ();
353
371
krsort ($ headers );
372
+ $ cookie_session_name = method_exists ('XenoPostToForm ' , 'g5_session_name ' ) ? XenoPostToForm::g5_session_name () : 'PHPSESSID ' ;
354
373
foreach ($ headers as $ header ) {
355
- if (!preg_match ('~^Set-Cookie: PHPSESSID =~ ' , $ header )) continue ;
374
+ if (!preg_match ('~^Set-Cookie: ' . $ cookie_session_name . ' =~ ' , $ header )) continue ;
356
375
$ header = preg_replace ('~; secure(; HttpOnly)?$~ ' , '' , $ header ) . '; secure; SameSite=None ' ;
357
376
header ($ header , false );
358
377
$ g5 ['session_cookie_samesite ' ] = 'none ' ;
@@ -375,9 +394,8 @@ function session_start_samesite($options = array())
375
394
define ('G5_CAPTCHA_URL ' , G5_PLUGIN_URL .'/ ' .G5_CAPTCHA_DIR );
376
395
define ('G5_CAPTCHA_PATH ' , G5_PLUGIN_PATH .'/ ' .G5_CAPTCHA_DIR );
377
396
378
- // 4.00.03 : [보안관련] PHPSESSID 가 틀리면 로그아웃한다.
379
- if (isset ($ _REQUEST ['PHPSESSID ' ]) && $ _REQUEST ['PHPSESSID ' ] != session_id ())
380
- goto_url (G5_BBS_URL .'/logout.php ' );
397
+ // 4.00.03 : [보안관련] PHPSESSID 가 틀리면 로그아웃한다. php5.2 버전 이하에서만 해당되는 코드이며, 오히려 무한리다이렉트 오류가 일어날수 있으므로 주석처리합니다.
398
+ // if( method_exists('XenoPostToForm', 'php52_request_check') ) XenoPostToForm::php52_request_check();
381
399
382
400
// QUERY_STRING
383
401
$ qstr = '' ;
@@ -497,8 +515,8 @@ function session_start_samesite($options = array())
497
515
if (isset ($ _SESSION ['ss_mb_id ' ]) && $ _SESSION ['ss_mb_id ' ]) { // 로그인중이라면
498
516
$ member = get_member ($ _SESSION ['ss_mb_id ' ]);
499
517
500
- // 차단된 회원이면 ss_mb_id 초기화
501
- if ($ member ['mb_intercept_date ' ] && $ member ['mb_intercept_date ' ] <= date ("Ymd " , G5_SERVER_TIME )) {
518
+ // 차단된 회원이면 ss_mb_id 초기화, 또는 세션에 저장된 회원 토큰값을 비교하여 틀리면 초기화
519
+ 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 ' ])) ) {
502
520
set_session ('ss_mb_id ' , '' );
503
521
$ member = array ();
504
522
} else {
@@ -521,7 +539,7 @@ function session_start_samesite($options = array())
521
539
$ tmp_mb_id = substr (preg_replace ("/[^a-zA-Z0-9_]*/ " , "" , $ tmp_mb_id ), 0 , 20 );
522
540
// 최고관리자는 자동로그인 금지
523
541
if (strtolower ($ tmp_mb_id ) !== strtolower ($ config ['cf_admin ' ])) {
524
- $ sql = " select mb_password, mb_intercept_date, mb_leave_date, mb_email_certify from {$ g5 ['member_table ' ]} where mb_id = ' {$ tmp_mb_id }' " ;
542
+ $ 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 }' " ;
525
543
$ row = sql_fetch ($ sql );
526
544
if ($ row ['mb_password ' ]){
527
545
$ key = md5 ($ _SERVER ['SERVER_ADDR ' ] . $ _SERVER ['SERVER_SOFTWARE ' ] . $ _SERVER ['HTTP_USER_AGENT ' ] . $ row ['mb_password ' ]);
@@ -534,6 +552,7 @@ function session_start_samesite($options = array())
534
552
(!$ config ['cf_use_email_certify ' ] || preg_match ('/[1-9]/ ' , $ row ['mb_email_certify ' ])) ) {
535
553
// 세션에 회원아이디를 저장하여 로그인으로 간주
536
554
set_session ('ss_mb_id ' , $ tmp_mb_id );
555
+ if (function_exists ('update_auth_session_token ' )) update_auth_session_token ($ row ['mb_datetime ' ]);
537
556
538
557
// 페이지를 재실행
539
558
echo "<script type='text/javascript'> window.location.reload(); </script> " ;
0 commit comments