본문 바로가기
개발하는 '정'/PHP

[PHP] 그누보드 정보수정 비밀번호 확인 건너뛰기

by 주앤정_블로그 2022. 8. 17.

그누보드는 회원정보수정 페이지에 접근할 때마다 비밀번호를 입력해야한다.

 

정보수정 페이지에 탭을 추가해서 왔다갔다 해야하는데

매번 비밀번호 확인을 하니 번거롭다는 의견이 있어서 ..

비밀번호를 한번 인증한 경우! 세션이 만료되기 전까지 비밀번호를 입력하지 않아도 되도록 처리하고자 한다.

 

수정할 파일은 bbs 폴더의 register_form.php, member_confirm.php, logout.php 이다.

 


 

1. 정보수정 페이지 최초 접근 시

- 1) 인증 완료 세션 생성 [ register_form.php ]

include_once($member_skin_path.'/register_form.skin.php');

run_event('register_form_after', $w, $agree, $agree2);

//회원정보수정 인증 세션 생성 2022.08.17
$token2 = md5(uniqid(rand(), true));
set_session("ss_pre_access_token",$token2);

include_once('./_tail.php');

정보수정 페이지에 최초 접근했을 때 모든 검사가 완료된 후, 인증이 완료되었음을 저장하는 세션을 생성한다.

register_form.php 파일의 최하단 쪽에 $token2 ... 부분을 추가한다.

 

 

2. 다시 정보수정 페이지에 접근한 경우 

- 1) 인증 완료 세션 여부 확인 [ member_confirm.php ]

$g5['title'] = '회원 비밀번호 확인';
include_once('./_head.sub.php');

//인증 완료 세션이 있는 경우 2022.08.17
if( get_session("ss_pre_access_token") ){
	$params = array('pre_access'=>get_session("ss_pre_access_token"));
	$url = replaceQueryParams($url, $params);
	goto_url($url);
}

// url 체크
check_url_host($url, '', G5_URL, true);

인증 후 다시 정보수정 페이지에 접근했을 때, 1번에서 만든 세션이 있는지 확인하는 소스를 추가한다. (22줄 쯤)

해당 세션이 있으면, 비밀번호 입력 페이지를 생략하고 바로 정보수정 소스(register_form.php)로 이동한다.

단순히 해당 세션이 있는지만 검사하는데, 1번의 세션 값과 같은지까지 확인할 수 있으면 더 좋을 듯

 

- 2) 검사 생략 [ register_form.php ]

// 불법접근을 막도록 토큰생성
$token = md5(uniqid(rand(), true));
set_session("ss_token", $token);
set_session("ss_cert_no",   "");
set_session("ss_cert_hash", "");
set_session("ss_cert_type", "");

$is_social_login_modify = false;

if( isset($_REQUEST['provider']) && $_REQUEST['provider']  && function_exists('social_nonce_is_valid') ){   //모바일로 소셜 연결을 했다면
    if( social_nonce_is_valid(get_session("social_link_token"), $provider) ){  //토큰값이 유효한지 체크
        $w = 'u';   //회원 수정으로 처리
        $_POST['mb_id'] = $member['mb_id'];
        $is_social_login_modify = true;
    }
}

//인증 완료 세션이 있는 경우 2022.08.17
$is_pre_access_modify = false;
if( isset($_REQUEST['pre_access']) && $_REQUEST['pre_access']){ 
    if( get_session("ss_pre_access_token") == $_REQUEST['pre_access'] ){ //토큰값이 유효한지 체크
        $w = 'u';   //회원 수정으로 처리
        $_POST['mb_id'] = $member['mb_id'];
        $is_pre_access_modify = true;
    }
}

2-1) 을 통해 정보수정 페이지로 이동했을 때, 여러가지 검사를 생략할 수 있도록 소스를 수정한다.

소셜 로그인인 경우처럼 인증 완료 세션이 있는 경우에 생략 플래그($is_pre_access_modify)를 설정한다. (25줄 쯤)

 

} else if ($w == 'u') {

    if ($is_admin == 'super')
        alert('관리자의 회원정보는 관리자 화면에서 수정해 주십시오.', G5_URL);

    if (!$is_member)
        alert('로그인 후 이용하여 주십시오.', G5_URL);

    if ($member['mb_id'] != $_POST['mb_id'])
        alert('로그인된 회원과 넘어온 정보가 서로 다릅니다.');

    /*
    if (!($member[mb_password] == sql_password($_POST[mb_password]) && $_POST[mb_password]))
        alert("비밀번호가 틀립니다.");

    // 수정 후 다시 이 폼으로 돌아오기 위해 임시로 저장해 놓음
    set_session("ss_tmp_password", $_POST[mb_password]);
    */
    
    if($_POST['mb_id'] && ! (isset($_POST['mb_password']) && $_POST['mb_password'])){
        if( ! $is_social_login_modify && !$is_pre_access_modify ){ //인증 완료 세션이 있는 경우 생략 2022.08.17
            alert('비밀번호를 입력해 주세요.');
        }
    }

생략 플래그가 있는 경우 비밀번호 입력 여부 검사를 생략한다. (93줄 쯤)
if( ! $is_social_login_modify ){ 를 if( ! $is_social_login_modify && !$is_pre_access_modify ){ 로 수정.

 

 

3. 로그아웃 시 인증 완료 세션 초기화 [ logout.php ]

// 자동로그인 해제 --------------------------------
set_cookie('ck_mb_id', '', 0);
set_cookie('ck_auto', '', 0);
// 자동로그인 해제 end --------------------------------

//회원정보수정 인증 세션 삭제 2022.08.17
set_cookie('ss_pre_access_token', '', 0);

로그아웃 시 해당 세션을 초기화한다. (18줄 쯤)

새로 로그인하는 경우 다시 비밀번호를 검사하기 위함이다. 

 


 

sns 인증 기능을 응용한 단순한 기능이지만, 보안 좀 강화하면 쓸만할 것 같아서 기록해둔다.

로그인했을 때 해당 세션을 생성하면, 계속 비밀번호 확인 기능이 생략되는 등으로 응용할 수 있을 것 같다.

반응형

댓글