data 폴더 파일이 웹에서 그대로 열리는 문제 — .htaccess 없이 막는 법
그누보드로 뭔가 만들다 보면 data 폴더에 CSV·JSON·로그를 쌓게 됩니다. 문의 접수 내역, 방문 로그, 설정값 같은 것들입니다.
문제는 주소만 알면 브라우저로 그대로 열린다는 점입니다. /data/inbox.csv 를 치면 접수 내역이 통째로 다운로드됩니다.
.htaccess 가 항상 통하지는 않습니다
보통 .htaccess 로 막지만, 이 방법은 세 가지 상황에서 실패합니다.
- 호스팅에서
AllowOverride가 꺼져 있으면 .htaccess 자체가 무시됩니다 - nginx 환경이면 .htaccess 를 아예 읽지 않습니다
- FTP 계정 권한이 제한돼 폴더나 설정 파일을 못 만드는 경우가 있습니다 (실제로 겪었습니다 — mkdir 이 Permission denied 로 막히는 계정이 있습니다)
확실한 방법 — 확장자를 .php 로 두고 첫 줄에 차단 코드
파일명을 inbox.csv 대신 inbox.csv.php 로 저장하고, 첫 줄에 이걸 넣습니다.
<?php http_response_code(404); exit; ?> "2026-07-29 10:00:00","AB1234","홍길동","010-0000-0000","문의 내용" "2026-07-29 11:20:11","CD5678","김철수","010-1111-2222","견적 문의"
브라우저로 직접 열면 PHP가 첫 줄을 실행해 404를 내보내고 끝냅니다. 뒤에 있는 데이터는 출력되지 않습니다. 서버 설정과 무관하게 동작합니다.
쓸 때
$log = __DIR__.'/data/inbox.csv.php';
if (!file_exists($log)) {
@file_put_contents($log, "<?php http_response_code(404); exit; ?>\n");
}
@file_put_contents($log, '"'.implode('","', $row)."\"\n", FILE_APPEND|LOCK_EX);
LOCK_EX 를 빼면 동시 요청에서 줄이 섞여 깨집니다. 반드시 넣으세요.
읽을 때 — 첫 줄만 건너뛰면 됩니다
$fh = fopen($log, 'r');
$first = true;
while (($line = fgets($fh)) !== false) {
if ($first) { $first = false; if (strpos($line, '<?php') === 0) continue; }
$line = rtrim($line, "\r\n");
if ($line === '') continue;
$c = str_getcsv($line);
// $c[0] 시각, $c[1] 번호, ...
}
fclose($fh);
JSON도 같은 방식으로 됩니다
/* 저장 */ @file_put_contents($f, "<?php http_response_code(404); exit; ?>\n".json_encode($data, JSON_UNESCAPED_UNICODE), LOCK_EX); /* 읽기 — 첫 줄 다음부터 파싱 */ $raw = @file_get_contents($f); $p = strpos($raw, "\n"); $data = json_decode($p === false ? '' : substr($raw, $p + 1), true); if (!is_array($data)) $data = array();
설정값이나 세션 데이터를 파일로 들고 있을 때 편합니다. DB 없이 돌아가는 소규모 기능을 만들 때 특히 그렇습니다.
주의할 점
- 데이터에
<?php로 시작하는 문자열이 들어가지 않게 입력값을 정리하세요. CSV라면 큰따옴표·개행을 치환하는 것만으로 대부분 막힙니다. - 이건 직접 접근을 막는 것이지 암호화가 아닙니다. 서버 파일에 접근할 수 있는 사람은 그대로 볼 수 있습니다.
- 개인정보가 들어가는 파일이라면 보관 기간과 파기 시점을 함께 정해두세요. IP 같은 값은 소금값을 섞어 해시로 저장하면 부담이 크게 줄어듭니다.
- 파일이 계속 커지면 일정 크기에서
rename()으로 월 단위 분리를 걸어두는 게 좋습니다. 읽을 때glob()으로 합쳐서 보면 됩니다.
.htaccess 를 쓸 수 있는 환경이면 그쪽이 정석입니다. 다만 이 방법은 환경을 안 타서, 여러 호스팅에 배포하는 스킨이나 플러그인을 만들 때 특히 편합니다. 배포처마다 웹서버 설정을 확인할 필요가 없어집니다.
댓글 3개
g5 구조때문이죠
data 디렉토리가 노출된 구조때문이죠