2026, 새로운 도약을 시작합니다.

패치 후 다운로드 토큰 유효시간 오류 .... 채택완료

bb/download.php를 수정해서 사용중입니다.

(스크립트로 자료 펌 하는 것을 차단하기위해 비회원 다운로드 할때 리캡차 거쳐야 하고 하루 다운로드 횟수를 지정하도록 수정해서 사용중)

그런데 최근 

아래 보안패치를 하였는데....

https://github.com/gnuboard/gnuboard5/commit/27434107e8f6c84222e99352a877a2809eba12e9

회원로그인 상태에서는 다운로드가 문제가없는데

비회원으로 다운로드 할때는 리캡차를 거친 후 자동다운로드가 되지않고 

3025377459_1687167743.4336.gif

위와 같은 오류가 뜨면서 다운로드가 되지 않고 있습니다.

그래서 어쩔 수 없이 

다른 파일 패치한 부분은 그대로 사용하고

bb/download.php에서 추가된 보안패치 부분인 아래 소스만 제거하고 사용하고 있습니다.

(아래 보안패치 부분을 사용 안하면 오류가 안나옴)

Copy


$nonce = isset($_REQUEST['nonce']) ? preg_replace('/[^0-9a-z\|]/i', '', $_REQUEST['nonce']) : '';

 

if (function_exists('download_file_nonce_is_valid') && !defined('G5_DOWNLOAD_NONCE_CHECK')){

    if(! download_file_nonce_is_valid($nonce, $bo_table, $wr_id)){

        alert('토큰 유효시간이 지났거나 토큰이 유효하지 않습니다.\\n브라우저를 새로고침 후 다시 시도해 주세요.', G5_URL);

    }

}

여기에서 다시 위 보안패치 적용해서 오류안나게 하는 방법은 없을까요...?

아래 소스는 제가 사용하는 bb/download.php (리캡차 적용)에서 수정(추가)된 부분입니다.

Copy


include_once('./_common.php');

 

// 다운로드 캡차 추가된 부분 시작

 

include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');

 

//error_reporting(E_ALL);

//ini_set("display_errors", 1);

 

// get download policy

list($download_level, $download_limits) = explode(",", $board['bo_9']);

$download_lastdate = $board['bo_10'];

 

// get state

$state = $_REQUEST['state'];

 

// clear download history

$tmp_row = sql_fetch("select IFNULL(DATEDIFF(CURDATE(), '{$download_lastdate}'), 1) as dt");

if($tmp_row['dt'] > 0) {

    $sql = "delete from {$g5['memo_table']} where me_send_mb_id = '@download' and DATE(me_send_datetime)  CURDATE()";

    sql_query($sql);

 

    $sql = "update {$g5['board_table']} set bo_10 = '" . G5_TIME_YMD . "' where bo_table = '{$bo_table}'";

    sql_query($sql);

}

 

// if captcha key is empty

if(empty($state)) {

    // Page ID

    $pid = ($pid) ? $pid : '';

    $at = apms_page_thema($pid);

    include_once(G5_LIB_PATH.'/apms.thema.lib.php');

 

    // 스킨 체크

    list($member_skin_path, $member_skin_url) = apms_skin_thema('member', $member_skin_path, $member_skin_url);

 

    $g5['title'] = '자동수집방지';

 

    include_once(G5_PATH.'/head.sub.php');

    if(!USE_G5_THEME) @include_once(THEMA_PATH.'/head.sub.php');

 

    echo "html, body { background-color: transparent !important; }";

 

    $no = (int)$no;

    $skin_path = $member_skin_path;

    $skin_url = $member_skin_url;

    $action_url = G5_HTTPS_BBS_URL . "/download.php";

    @include_once($board_skin_path.'/download.captcha.skin.php');

 

    include_once(G5_PATH.'/tail.sub.php');

    if(!USE_G5_THEME) @include_once(THEMA_PATH.'/tail.sub.php');

 

    exit;

} elseif($download_level > $member['mb_level']) {

    if (!chk_captcha()) {

        echo "parent.close_download_captcha();";

        alert('자동수집방지에 오류가 발생하였습니다.');

    } else {

        // get IP address

        $ipaddress = '';

        if (getenv('HTTP_CLIENT_IP'))

            $ipaddress = getenv('HTTP_CLIENT_IP');

        else if(getenv('HTTP_X_FORWARDED_FOR'))

            $ipaddress = getenv('HTTP_X_FORWARDED_FOR');

        else if(getenv('HTTP_X_FORWARDED'))

            $ipaddress = getenv('HTTP_X_FORWARDED');

        else if(getenv('HTTP_FORWARDED_FOR'))

            $ipaddress = getenv('HTTP_FORWARDED_FOR');

        else if(getenv('HTTP_FORWARDED'))

           $ipaddress = getenv('HTTP_FORWARDED');

        else if(getenv('REMOTE_ADDR'))

            $ipaddress = getenv('REMOTE_ADDR');

        else

            $ipaddress = 'UNKNOWN';

 

        // check download limits

        if($download_limits > 0) {

            $tmp_row = sql_fetch("

                select count(*) as cnt from {$g5['memo_table']}

                   where me_memo = '$ipaddress'

                       and me_send_mb_id = '@download'

                       and DATE(me_send_datetime) = CURDATE()

            ");

            $download_currents = $tmp_row['cnt'];

            if($download_currents >= $download_limits) {

                alert_close("일일 내려받기 횟수를 초과하였습니다.(" . $download_limits . "회)\\n등업(3등급)하시면 제한하지 않습니다.");

            }

 

            // add download history

            $tmp_row = sql_fetch(" select max(me_id) as max_me_id from {$g5['memo_table']} ");

            $me_id = $tmp_row['max_me_id'] + 1;

            $me_memo = $ipaddress;

            $sql = "

                insert into {$g5['memo_table']} ( me_id, me_recv_mb_id, me_send_mb_id, me_send_datetime, me_read_datetime, me_memo )

                    values ($me_id, '@download', '@download', '" . G5_TIME_YMDHIS . "', '" . G5_TIME_YMDHIS . "', '$me_memo')

            ";

            sql_query($sql);

        }

    }

}

 

// 다운로드 캡차 추가된 부분 끝

 

// clean the output buffer

ob_end_clean();

 

위 수정된 부분 같이 사용하면서 보안 패지부분 적용해서 오류안나게 사용할 방법이 있는지

도움 좀 부탁드립니다.

답변 1개

채택된 답변
+20 포인트
download_file_nonce_is_valid 여기 함수 어떤지 확인해야될것같아요
로그인 후 평가할 수 있습니다

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

답변을 작성하려면 로그인이 필요합니다.

로그인
🐛 버그신고