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

스킨의 내용보기에서 권한검사 추가시 조회수가 올라갈경우

이내용은 스킨/view_skin.php 에서 내용을 볼수있는 권한이 있는지를
사용자가 별도로 추가한 검사코드를 실행시 문제점을 해결하는 방법 및
그룹접근 제어과정에서 리스트를 열람할수있는 문제점을 정리한 것입니다.

해당파일은 그누보드 4.06.14 버전이며 bbs/board.php 입니다.

1,그룹접근 제어시 리스트를 볼수있는 문제점 및 중복검사 관련

2,스킨/view_skin.php 에서 내용을 볼수있는 권한이 있는지를 사용자가 별도로 추가한 검사코드를
실행시 조회수가 올라가는문제 및 내용보기에서 포인트차감 사용시 포인트가 깍이는 문제점 관련


아래의 코드는 위의 문제점들을 해결하기 위해서 임의로 수정된
G4 - 4.06.14 버전의 bbs/board.php 의 전체 코드이며
코드내부에서 설명을 참고 하시면 됩니다.

수정된 코드에서 지적사항 및 문제발견시 알려주시면 합니다.^^;


============임의로 수정된 bbs/board.php =============


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

if (!$board[bo_table])
{
if ($cwin) // 코멘트 보기
alert_close("존재하지 않는 게시판입니다.", $g4[path]);
else
alert("존재하지 않는 게시판입니다.", $g4[path]);
}

if ($write[wr_is_comment])
{
/*
if ($cwin) // 코멘트 보기
alert_close("코멘트는 상세보기 하실 수 없습니다.");
else
alert("코멘트는 상세보기 하실 수 없습니다.");
*/
goto_url("./board.php?bo_table=$bo_table&wr_id=$write[wr_parent]#c_{$wr_id}");
}

if (!$bo_table)
{
$msg = "bo_table 값이 넘어오지 않았습니다.\\n\\nboard.php?bo_table=code 와 같은 방식으로 넘겨 주세요.";
if ($cwin) // 코멘트 보기
alert_close($msg);
else
alert($msg);
}

// 그룹접근 사용 - 그룹별 권한시 목록을 볼수있는 문제점 및 중복체크 때문에 검사 순서를 바꾸고 위치이동 -헐랭이
if ($group[gr_use_access])
{
// 그룹관리자 이상이라면 통과
if ($is_admin == "super" || $is_admin == "group")
;
else
{
// 그룹접근
$sql = " select count(*) as cnt
from $g4[group_member_table]
where gr_id = '$board[gr_id]' and mb_id = '$member[mb_id]' ";
$row = sql_fetch($sql);
if (!$row[cnt])
alert("접근 권한이 없으므로 글읽기가 불가합니다.\\n\\n궁금하신 사항은 관리자에게 문의 바랍니다.", $g4[path]);
}
if (!$member[mb_id]) {
$msg = "비회원은 이 게시판에 접근할 권한이 없습니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오.";
if ($cwin)
alert_close($msg);
else
alert($msg, "./login.php?wr_id=$wr_id{$qstr}&url=".urlencode("./board.php?bo_table=$bo_table&wr_id=$wr_id"));
}
}
// 그룹접근 사용 - 그룹별 권한시 목록을 볼수있는 문제점 및 중복체크 때문에 검사 순서를 바꾸고 위치이동끝 -헐랭이

// wr_id 값이 있으면 글읽기
if ($wr_id)
{
// 글이 없을 경우 해당 게시판 목록으로 이동
if (!$write[wr_id])
{
$msg = "글이 존재하지 않습니다.\\n\\n글이 삭제되었거나 이동된 경우입니다.";
if ($cwin)
alert_close($msg);
else
alert($msg, "./board.php?bo_table=$bo_table");
}
/*
//////////////////////////////////원본이며 주석처리함 - 헐랭이//////////////////////////////////
// 그룹접근 사용
if ($group[gr_use_access])
{
if (!$member[mb_id]) {
$msg = "비회원은 이 게시판에 접근할 권한이 없습니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오.";
if ($cwin)
alert_close($msg);
else
alert($msg, "./login.php?wr_id=$wr_id{$qstr}&url=".urlencode("./board.php?bo_table=$bo_table&wr_id=$wr_id"));
}

// 그룹관리자 이상이라면 통과
if ($is_admin == "super" || $is_admin == "group")
;
else
{
// 그룹접근
$sql = " select count(*) as cnt
from $g4[group_member_table]
where gr_id = '$board[gr_id]' and mb_id = '$member[mb_id]' ";
$row = sql_fetch($sql);
if (!$row[cnt])
alert("접근 권한이 없으므로 글읽기가 불가합니다.\\n\\n궁금하신 사항은 관리자에게 문의 바랍니다.", $g4[path]);
}
}
*/
//////////////////////////////////원본이며 주석처리끝 - 헐랭이//////////////////////////////////

// 로그인된 회원의 권한이 설정된 읽기 권한보다 작다면
if ($member[mb_level] < $board[bo_read_level])
{
if ($member[mb_id])
alert("글을 읽을 권한이 없습니다.");
else
alert("글을 읽을 권한이 없습니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오.", "./login.php?wr_id=$wr_id{$qstr}&url=".urlencode("board.php?bo_table=$bo_table&wr_id=$wr_id"));
}

// 자신의 글이거나 관리자라면 통과
if (($write[mb_id] && $write[mb_id] == $member[mb_id]) || $is_admin)
;
else
{
// 비밀글이라면
if (strstr($write[wr_option], "secret")) {
$ss_name = "ss_secret_{$bo_table}_$write[wr_num]";
//$ss_name = "ss_secret_{$bo_table}_{$wr_id}";
// 한번 읽은 게시물의 번호는 세션에 저장되어 있고 같은 게시물을 읽을 경우는 다시 패스워드를 묻지 않습니다.
// 이 게시물이 저장된 게시물이 아니면서 관리자가 아니라면
//if ("$bo_table|$write[wr_num]" != get_session("ss_secret"))
if (!get_session($ss_name))
goto_url("./password.php?w=s&bo_table=$bo_table&wr_id=$wr_id{$qstr}");

set_session($ss_name, TRUE);
}
}

////스킨에서 추가한 검사과정에서 내용을볼수 없음에도 불구하고 조회수와 포인트가 차감되는 문제 때문에 주석처리함 -헐랭이//////
// 한번 읽은글은 브라우저를 닫기전까지는 카운트를 증가시키지 않음
/*
$ss_name = "ss_view_{$bo_table}_{$wr_id}";
if (!get_session($ss_name))
{
sql_query(" update $write_table set wr_hit = wr_hit + 1 where wr_id = '$wr_id' ");

// 자신의 글이면 통과
if ($write[mb_id] && $write[mb_id] == $member[mb_id])
;
else
{
// 회원이상 글읽기가 가능하다면
if ($board[bo_read_level] > 1) {
if ($member[mb_point] + $board[bo_read_point] < 0)
alert("보유하신 포인트(".number_format($member[mb_point]).")가 없거나 모자라서 글읽기(".number_format($board[bo_read_point]).")가 불가합니다.\\n\\n포인트를 모으신 후 다시 글읽기 해 주십시오.");

insert_point($member[mb_id], $board[bo_read_point], "$board[bo_subject] $wr_id 글읽기", $bo_table, $wr_id, '읽기');
}
}

set_session($ss_name, TRUE);
}
*/
////스킨에서 추가한 검사과정에서 내용을볼수 없음에도 불구하고 조회수와 포인트가 차감되는 문제 때문에 주석처리끝 -헐랭이//////

$g4[title] = "$group[gr_subject] > $board[bo_subject] > " . strip_tags(conv_subject($write[wr_subject], 255));
}
else
{
if ($member[mb_level] < $board[bo_list_level])
{
if ($member[mb_id])
alert("목록을 볼 권한이 없습니다.");
else
alert("목록을 볼 권한이 없습니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오.", "./login.php?wr_id=$wr_id{$qstr}&url=".urlencode("board.php?bo_table=$bo_table&wr_id=$wr_id"));
}

if (!$page) $page = 1;

$g4[title] = "$group[gr_subject] > $board[bo_subject] $page 페이지";
}

include_once("$g4[path]/head.sub.php");

$width = $board[bo_table_width];
if ($width <= 100) $width .= '%';

// IP보이기 사용 여부$ip = "";
$is_ip_view = $board[bo_use_ip_view];
if ($is_admin) {
$is_ip_view = true;
$ip = $write[wr_ip];
} else // 관리자가 아니라면 IP 주소를 감춘후 보여줍니다.
$ip = preg_replace("/([0-9]+).([0-9]+).([0-9]+).([0-9]+)/", "\\1.♡.\\3.\\4", $write[wr_ip]);

// 분류 사용
$is_category = false;
$category_name = "";
if ($board[bo_use_category]) {
$is_category = true;
$category_name = $write[ca_name]; // 분류명
}

// 추천 사용
$is_good = false;
if ($board[bo_use_good])
$is_good = true;

// 비추천 사용
$is_nogood = false;
if ($board[bo_use_nogood])
$is_nogood = true;

$admin_href = "";
// 최고관리자 또는 그룹관리자라면
if ($member[mb_id] && ($is_admin == 'super' || $group[gr_admin] == $member[mb_id]))
$admin_href = "$g4[admin_path]/board_form.php?w=u&bo_table=$bo_table";

if (!($board[bo_use_comment] && $cwin))
include_once("./board_head.php");

echo "<script language=\"javascript\" src=\"$g4[path]/js/sideview.js\"></script>\n";

if (!($board[bo_use_comment] && $cwin)) {
// 게시물 아이디가 있다면 게시물 보기를 INCLUDE
if ($wr_id)
include_once("./view.php");

////스킨에서 추가한 검사과정에서 내용을볼수 없음에도 불구하고 조회수와 포인트가 차감되는 문제 때문에 이동한 위치시작 -헐랭이//////
// 한번 읽은글은 브라우저를 닫기전까지는 카운트를 증가시키지 않음
$ss_name = "ss_view_{$bo_table}_{$wr_id}";
if (!get_session($ss_name))
{
sql_query(" update $write_table set wr_hit = wr_hit + 1 where wr_id = '$wr_id' ");

// 자신의 글이면 통과
if ($write[mb_id] && $write[mb_id] == $member[mb_id])
;
else
{
// 회원이상 글읽기가 가능하다면
if ($board[bo_read_level] > 1) {
if ($member[mb_point] + $board[bo_read_point] < 0)
alert("보유하신 포인트(".number_format($member[mb_point]).")가 없거나 모자라서 글읽기(".number_format($board[bo_read_point]).")가 불가합니다.\\n\\n포인트를 모으신 후 다시 글읽기 해 주십시오.");

insert_point($member[mb_id], $board[bo_read_point], "$board[bo_subject] $wr_id 글읽기", $bo_table, $wr_id, '읽기');
}
}

set_session($ss_name, TRUE);
}

////스킨에서 추가한 검사과정에서 내용을볼수 없음에도 불구하고 조회수와 포인트가 차감되는 문제 때문에 이동한 위치끝 -헐랭이//////
// 전체목록보이기 사용이 "예" 또는 wr_id 값이 없다면 목록을 보임
//if ($board[bo_use_list_view] || empty($wr_id))
if ($member[mb_level] >= $board[bo_list_level] && $board[bo_use_list_view] || empty($wr_id))
include_once ("./list.php");

include_once("./board_tail.php");
}
else
include_once("./view_comment.php");

echo "\n<!-- 사용스킨 : $board[bo_skin] -->\n";

include_once("$g4[path]/tail.sub.php");
?>

댓글 작성

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

로그인하기

댓글 3개

헐랭이님!
남들이 잘 안하는 어려운 것만 하십니다.
감사합니다.
지적하신 대로 정말이네요.
좋은 팁 감사합니다. ^^
감사합니다~*
혹시나 하고 살펴봤으나 여전히 최근 버전에서도,
지적해 주신 문제점이 수정되지 않고 있었습니다.

게시글 목록

번호 제목
2110
2102
2101
2100
2084
2081
2074
2057
2055
2044
2040
2029
2028
2023
2014
2009
2005
2002
1991
1990