is_admin() 함수 안의 후크 run_replace 사용 > 그누보드5 팁자료실

그누보드5 팁자료실

is_admin() 함수 안의 후크 run_replace 사용 정보

is_admin() 함수 안의 후크 run_replace 사용

본문

* 그누 버전 : 5.4.2.7

 

여차 저차 이유로 is_admin 함수에 있는 run_replace를 사용(후킹?)하게 될 일이 생겼습니다.


// 관리자인가?
function is_admin($mb_id)
{
    global $config, $group, $board;
    if (!$mb_id) return '';
    $is_authority = '';
    if ($config['cf_admin'] == $mb_id){
        $is_authority = 'super';
    } else if (isset($group['gr_admin']) && ($group['gr_admin'] == $mb_id)){
        $is_authority = 'group';
    } else if (isset($board['bo_admin']) && ($board['bo_admin'] == $mb_id)){
        $is_authority = 'board';
    }
    return run_replace('is_admin', $is_authority, $mb_id);  //<== 후킹하라고 되어 있네요.
}

 

그래서... 이전에 공부한데로 했는데... 되질 않더군요... 흠냐...

https://sir.kr/g5_tip/13915?sfl=wr_name%2C1&stx=%EB%A7%8C%EC%88%98%ED%82%B4

안되는 이유부터 말씀드리자면,

is_admin() 함수는 common.php의 470라인(근처)에서 호출이 됩니다.

그러나 extend 디렉토리에 있는 확장 함수 호출은 660라인(근처)에서 호출이 되고 있어서

extend 디렉토리에 OOO.extend.php를 만들어도 수행이 되지 않는 것이었습니다.

 

혹여, 저와 같은 경우가 발생하시는 분은 아래와 같이 하시면 될 듯 하여 글을 써봅니다.

 

먼저 extend 폴더에 pre.hook_extend.php 파일을 만드세요.

내용은 아래와 같습니다.


<?php    if (!defined('_GNUBOARD_')) exit;
//return run_replace('is_admin', $is_authority, $mb_id);
add_replace("is_admin", "is_system_admin", 5, 2);
function is_system_admin($is_authority, $mb_id) {
    global $config;
    //echo "HOOK(is_system_admin) - is_authority : ". $is_authority ."<br>\n";
    //echo "HOOK(is_system_admin) - mb_id : ". $mb_id ."<br>\n";
    $is_authority = "ulalalala";
    return $is_authority;
}

 

그리고 common.php에서 is_admin 함수를 호출하기 전에 위의 파일을 include하시면 됩니다.


if ($gr_id && !is_array($gr_id)) {
    $group = get_group($gr_id);
}
 
// is_admin함수에 Hook 활용을 위하여 추가함. by tank. at 200802.
include G5_EXTEND_PATH ."/pre.hook_extend.php";
 
// 회원, 비회원 구분
$is_member = $is_guest = false;
$is_admin = '';
if ($member['mb_id']) {
    $is_member = true;
    $is_admin = is_admin($member['mb_id']);
    $member['mb_dir'] = substr($member['mb_id'],0,2);
} else {
    $is_guest = true;
    $member['mb_id'] = '';
    $member['mb_level'] = 1; // 비회원의 경우 회원레벨을 가장 낮게 설정
}

 

마지막으로 테스트를 해보아야 합니다.

전 /_test/gnu.php를 만들고 아래와 같이 작성하였습니다.

(당연히 _test 디렉토리 밑에 _common.php도 가져다 놓아야 합니다.)


<?php
include_once('./_common.php');
echo "<br>=================================<br>";
echo "그누 테스트!!<br>";
echo "is_admin => ". $is_admin;
?>

 

제가 관리자로 로그인했으니,

후킹을 안했더라면 "super"가 나와야 하지만,

후킹을 해서 "ulalala"가 출력되는 것을 확인할 수 있습니다.

2949618301_1596363716.4715.png

 

확인은 안해봤습니다만...

common.php 파일의 660라인(근처) 이전에 후킹을 해야 하는 상황이 생긴다면,

pre.hook_extend.php 파일에 계속 추가하면 되겠습니다.

 

작은 도움이라도 되면 좋겠네요 ^^

추천
2

댓글 6개

전체 2,427 |RSS
그누보드5 팁자료실 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT