테스트 사이트 - 개발 중인 베타 버전입니다

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

· 5년 전 · 4077 · 6

* 그누 버전 : 5.4.2.7

 

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

[code]

// 관리자인가?
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);  //<== 후킹하라고 되어 있네요.
}

[/code]

 

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

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 파일을 만드세요.

내용은 아래와 같습니다.

[code]

<?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;
}

[/code]

 

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

[code]

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; // 비회원의 경우 회원레벨을 가장 낮게 설정
}

[/code]

 

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

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

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

[code]

<?php
include_once('./_common.php');

echo "<br>=================================<br>";
echo "그누 테스트!!<br>";

echo "is_admin => ". $is_admin;
?>

[/code]

 

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

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

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

2949618301_1596363716.4715.png

 

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

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

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

 

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

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

댓글 6개

훅 아직 개념을 몰라서 어렵네요 ㅎㅎ 감사합니다.
지도 개념은 잘 몰라유~~~
걍 일케 쓰는구나... 라는건만 간신히 ㅋㅋㅋ
그누보드의 버그라고 하면 @thisgun 님이 한번 확인해 주셔야 될 것 같습니다.
버그라고 하기엔 좀 애매한것같아요. 필요한 사림은 ㅈㅓ렇게 쓰면 되죠~ 뭐~ ㅎㅎ
extend안에 있는 것은 2번 불러지지 않나요? 그래도 레포트를 해주어야 그누보드가 발전하겠죠.
그래서 위에서 include하는 파일 명을 ooo.extend.php로 안하고 다른 형식으로 한거에요. 두 번 안불러지게요.

게시글 목록

번호 제목
24149
24140
24133
24125
24119
24109
24105
24101
24093
24089
24077
24074
24071
24070
24067
24056
24050
24046
24043
24040
24037
24036
24035
24034
24021
24017
24005
24002
23990
23980