게시판 파일 업로드 보안·성능을 강화하는 “사전 검증 + 이중 검사 > 그누보드5 팁자료실

그누보드5 팁자료실

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

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

본문

그누보드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('유효하지 않은 이미지 파일입니다.');
    }
}
 

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

추천
8

댓글 4개

전체 2,742 |RSS
그누보드5 팁자료실 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT