이 글은 관리자가 설정한 특별한 코드를 입력해야만 사용자가 특정 게시판에 접근할 수 있도록 하는 방법에 대해 설명합니다. 이 방법은 일반적인 게시물의 비밀글 기능과는 달리 특정 게시판의 전체 리스트, 내용 보기, 글쓰기 등에 적용됩니다. 코드를 변경하면, 이전에 접근 가능했던 사용자들도 다시 코드를 입력해야 접근할 수 있으므로, 변경된 코드를 사용자들에게 재공지 해야 합니다.
구현 방법 요약:
- 사용자가 게시판에 접근하려고 할 때, 해당 사용자가 코드를 이미 입력했는지 확인하기 위해 세션을 검사합니다.
- 사용자가 코드를 입력하지 않았거나 세션 기록이 없다면, 코드 입력 화면이 표시됩니다.
- 사용자가 코드를 입력하거나 세션 기록이 있다면, 게시판에 접근이 허용됩니다.
- 사용자의 브라우저가 종료되거나 일정 시간 동안 활동이 없다면, 세션이 삭제됩니다.
- 최고 관리자의 경우 세션에 대한 검사를 수행하지 않습니다. (관리자 프리패스)
구현 내용:
1. 게시판 접근 암호 설정
- 관리자 페이지 > 게시판 관리 > 게시판 설정 > 여분필드 1 값
게시판에 접근할 수 있는 암호 코드를 게시판 여분필드 1 값에 입력합니다.
아래의 구현한 스크립트에서는 영문(대소문자 구분)과 숫자로 이루어져 있는지 검사하도록 되어있습니다.

2. 세션 시작 및 게시판 접근 시 코드 확인 로직 시작:
- 파일: bbs/board.php
[code]
<?php
include_once('./_common.php');
[/code]
파일의 최상단 위의 코드를 찾아 그 아래에 다음에 올 코드를 적용합니다.
[code]
session_start();
function convertToSeconds($hours, $minutes, $seconds) {
return ($hours * 3600) + ($minutes * 60) + $seconds;
}
$accessCode = $board['bo_1']; // 관리자가 설정한 접근 코드, 게시판 설정 여분
$boardId = 'promotion'; // 특정 게시판의 bo_table ID, 예제에서는 promotion 게시판
$sessionDuration = convertToSeconds(0, 10, 0); // 세션 유지시간 (시간, 분, 초), 예제에서는 10분
if ($bo_table == $boardId) {
if ($is_admin === 'super') {
// 최고 관리자는 바로 접근 가능
} else {
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['code']) && $accessCode !== '') {
if ($_POST['code'] === $accessCode) {
$_SESSION['board_access'] = time();
// 세션 만료 시간 설정
$_SESSION['session_expire'] = time() + $sessionDuration;
header("Location: " . G5_URL.'/'.$bo_table); // 세션 만료시 리다이렉트 되는 URL
exit;
} else {
alert('코드가 일치하지 않습니다.');
}
}
if (isset($_SESSION['session_expire'])) {
if (time() > $_SESSION['session_expire']) {
// 세션 종료
unset($_SESSION['board_access']);
unset($_SESSION['session_expire']);
echo "<script>alert('세션이 만료되었습니다. 다시 코드를 입력해주세요.');</script>";
include_once(G5_BBS_PATH.'/code_check.php'); // 코드 입력 폼
exit;
}
} else {
include_once(G5_BBS_PATH.'/code_check.php'); // 코드 입력 폼
exit;
}
}
}
[/code]
3. bbs/board.php에서 include()로 가져올 입력폼 생성 및 작성
- 파일: bbs/code_check.php (각자의 웹사이트에 맞도록 디자인해서 사용하시면 됩니다.)
[code]
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
include_once(G5_PATH.'/head.php');
?>
<form name="promotion_code" action="<?php echo G5_URL; ?>/promotion" onsubmit="return code_submit(this);" method="post">
<fieldset>
<legend>프로모션 코드 입력</legend>
<label for="code">접근코드</label>
<input type="text" name="code" id="code" required class="required" placeholder="코드" oninput="return restrictInput(this, event)">
<button type="submit">입력하기</button>
</fieldset>
</form>
<script>
function restrictInput(input, event) {
var value = input.value;
input.value = value.replace(/[^a-zA-Z0-9]/g, '');
}
function code_submit(f) {
var code = f.code.value;
// 코드가 비어있는지 확인
if (code == "") {
alert("코드를 입력해주세요.");
f.code.focus();
return false;
}
// 코드가 영문자(대소문자 구분), 숫자만 포함하는지 확인
var validCharacters = /^[a-zA-Z0-9]+$/;
if (!validCharacters.test(code)) {
alert("코드는 영문자(대소문자 구분)과 숫자만 포함할 수 있습니다.");
f.code.focus();
return false;
}
return true;
}
</script>
<?php include_once(G5_PATH.'/tail.php');
[/code]
이렇게 설정하면, 특정 게시판에 접근하려고 하면 세션을 검사하고, 생성된 세션이 없다면 코드 입력 폼을 include 하여 코드를 입력하도록 합니다. 코드를 올바르게 입력하면 세션을 생성하고, 해당 게시판의 활동이 설정한 시간 동안 유지됩니다. 설정된 시간 동안 활동이 없거나, 브라우저를 종료하면 세션이 만료되어 사라지고, 이후 다시 접근하려면 코드를 다시 입력해야 합니다.
제 프로젝트에 적용한 내용을 재작성한 것이기 때문에 오류가 발생할 수 있습니다.
오류가 있을 경우 알려주시면 감사하겠습니다.
댓글 11개
게시글 목록
| 번호 | 제목 |
|---|---|
| 24318 | |
| 24317 | |
| 24315 | |
| 24309 | |
| 24294 | |
| 24293 | |
| 24277 | |
| 24262 | |
| 24260 | |
| 24253 | |
| 24251 | |
| 24236 | |
| 24233 | |
| 24228 | |
| 24226 | |
| 24221 | |
| 24214 | |
| 24203 | |
| 24201 | |
| 24199 | |
| 24196 | |
| 24195 | |
| 24194 | |
| 24192 | |
| 24191 | |
| 24187 | |
| 24185 | |
| 24183 | |
| 24172 | |
| 24168 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기