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

게시판 파일 업로드 보안·성능을 강화하는 “사전 검증 + 이중 검사

그누보드5 기본 업로드 구조는 사용자가 파일을 선택하면 서버로 바로 전송한 뒤 PHP에서 확장자와 용량을 검사하는 방식이기 때문에, 대용량 파일이나 악성 스크립트 파일이 서버까지 도달하는 구조적 문제가 있습니다.

이를 개선하기 위해서는 업로드 전 자바스크립트 1차 검증 + 서버단 2차 검증을 동시에 적용해야 하며, 이 방식은 트래픽 절감·서버 부하 감소·보안 강화를 한 번에 해결할 수 있습니다.

먼저 게시판 글쓰기 페이지(write.skin.php)에서 자바스크립트로 파일 크기와 확장자를 미리 차단합니다.

<input type="file" name="bf_file[]" onchange="fileCheck(this)">

<script>
function fileCheck(input) {
  const file = input.files[0];
  const maxSize = 5 * 1024 * 1024; // 5MB
  const allowExt = ['jpg','jpeg','png','gif','pdf'];

  const ext = file.name.split('.').pop().toLowerCase();

  if (!allowExt.includes(ext)) {
    alert('허용되지 않은 파일 형식입니다.');
    input.value = '';
    return;
  }

  if (file.size > maxSize) {
    alert('파일 용량은 5MB 이하만 가능합니다.');
    input.value = '';
  }
}
</script>
 

이 단계에서 불필요한 업로드 요청의 대부분이 차단되어 서버로 전송되는 데이터 자체가 크게 줄어듭니다.

다음으로 서버단(bbs/write_update.php)에서 확장자 + MIME 타입 + 파일 시그니처를 함께 검사합니다.

$allow_mime = ['image/jpeg','image/png','image/gif','application/pdf'];
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['bf_file']['tmp_name'][$i]);
finfo_close($finfo);

if (!in_array($mime, $allow_mime)) {
    alert('허용되지 않은 파일입니다.');
}
 

여기에 이미지 파일의 경우 getimagesize()로 실제 이미지 여부를 한 번 더 확인하면, 확장자만 위장한 PHP·JS 파일 업로드를 거의 완벽하게 차단할 수 있습니다.

if (strpos($mime, 'image/') === 0) {
    if (!getimagesize($_FILES['bf_file']['tmp_name'][$i])) {
        alert('유효하지 않은 이미지 파일입니다.');
    }
}
 

이 구조를 적용하면 게시판 파일 업로드 시 서버 디스크 사용량이 줄어들고, 악성 파일 업로드 시도 대부분이 사전에 차단되며, 트래픽이 많은 이미지 게시판·자료실에서도 서버 안정성이 눈에 띄게 향상됩니다. 특히 공공기관·기업 사이트처럼 보안 요구사항이 높은 환경에서는 사실상 필수적인 고급 적용 방식입니다.

1명이 반응했습니다
|

댓글 4개

추천 꾸욱!! 감사합니다 ^^

참 중요한 프로세스입니다.

댓글 작성

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

로그인하기

그누보드5 팁자료실

번호 제목 글쓴이 날짜 조회
공지 3년 전 조회 4,592
2741 어제 조회 76
2740 3일 전 조회 82
2739 1주 전 조회 194
2738 1주 전 조회 200
2737 1주 전 조회 168
2736 1주 전 조회 268
2735 2주 전 조회 273
2734 3주 전 조회 255
2733 1개월 전 조회 257
2732 1개월 전 조회 292
2731 1개월 전 조회 260
2730 1개월 전 조회 217
2729 1개월 전 조회 343
2728 1개월 전 조회 237
2727 1개월 전 조회 412
2726 1개월 전 조회 247
2725 1개월 전 조회 322
2724 1개월 전 조회 351
2723 1개월 전 조회 259
2722 1개월 전 조회 292
2721 1개월 전 조회 205
2720 2개월 전 조회 298
2719 2개월 전 조회 301
2718 2개월 전 조회 195
2717 2개월 전 조회 328
2716 2개월 전 조회 197
2715 2개월 전 조회 305
2714 2개월 전 조회 265
2713 2개월 전 조회 368
2712 2개월 전 조회 283
🐛 버그신고