security: KVE-2026-2330 비회원 게시물 수정 인증과 토큰 발급 검증 강화

기존 비밀번호 확인 이력을 게시판·게시물·비밀번호에 결합하고 저장 전 검증한다. 인증은 30분 후 만료되며 저장 후 폐기한다. 일반 쓰기 토큰과 답변 세션으로 수정 인증을 대체할 수 없도록 한다.

1:1문의 토큰 발급을 로그인 회원의 해당 용도로 제한하고 게시판 토큰의 요청 경로와 대상을 확인한다. 최고관리자의 그누보드4 자료 이전은 유지한다.

검증: 비인증 수정 차단, 정상 비밀번호 변경 및 인증 폐기, 토큰 발급 엔드포인트 격리 검증과 PHP 문법 검사 통과.
This commit is contained in:
whitedot committed 2026-09-09 07:58:16 +00:00
1 parent fcc749bde3
commit 65875b7f35
5 files changed
+77 -37

No files matched your search

+25 -2
View File
@@ -4691,7 +4691,29 @@ function get_sql_affected_rows($link=null)
}
}
// 불법접근을 막도록 토큰을 생성하면서 토큰값을 리턴
// 비회원의 기존 비밀번호 확인 이력을 게시판과 게시물에 결합한다.
function g5_write_edit_auth_key($bo_table, $wr_id)
{
return 'ss_write_edit_'.hash('sha256', $bo_table.':'.(int)$wr_id);
}
function g5_grant_write_edit_auth($bo_table, $write)
{
set_session(g5_write_edit_auth_key($bo_table, $write['wr_id']), array(
'expires' => G5_SERVER_TIME + 1800,
'password' => hash('sha256', $write['wr_password'])
));
}
function g5_has_write_edit_auth($bo_table, $write)
{
$auth = get_session(g5_write_edit_auth_key($bo_table, $write['wr_id']));
return empty($write['mb_id']) && is_array($auth) && isset($auth['expires'], $auth['password'])
&& $auth['expires'] >= G5_SERVER_TIME
&& slow_equals(hash('sha256', $write['wr_password']), $auth['password']);
}
// 글쓰기 요청의 CSRF 토큰을 발급한다. 수정 권한은 별도로 확인한다.
function get_write_token($bo_table)
{
$token = get_random_token_string(16);
@@ -4710,7 +4732,8 @@ function check_write_token($bo_table)
$token = get_session('ss_write_'.$bo_table.'_token');
set_session('ss_write_'.$bo_table.'_token', '');
if(!$token || !$_REQUEST['token'] || $token != $_REQUEST['token'])
if (!is_string($token) || !$token || !isset($_POST['token']) || !is_string($_POST['token'])
|| !slow_equals($token, $_POST['token']))
alert('올바른 방법으로 이용해 주십시오.', G5_URL);
return true;