첨부파일 관련 질문 드립니다.

첨부파일 관련 질문 드립니다.

QA

첨부파일 관련 질문 드립니다.

본문

안녕하세요 게시판에서 첨부파일을 올릴때 서버단 파일 및 php 그리고 asp 등 이런 파일들은 못 올리게 하고 싶습니다.

그런데 현제 게시판에서 이런 파일들도 다 올라가더라구요 혹시 이거 제한 하려면 어떻게 하는지 알려 주시면 감사 드리겠습니다.

 

write.skin.php 파일 상단에 아래와 같이 했구요 그런데 테스트 해보니 여전히 서버단 파일이들이 올라거숑 못 올라가게 하고 싶어서요 

 

제가 잘 모르다 보니 GPT를 좀 활용을 했는데 안되서요 


<?
// 파일 확장자 및 MIME 타입 체크 함수
function check_uploaded_file($filename) {
    $allowed_extensions = array('jpg', 'jpeg', 'png', 'gif', 'pdf', 'docx', 'xlsx'); // 허용할 확장자 목록
    $file_extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
    return in_array($file_extension, $allowed_extensions);
}
function check_mime_type($tmp_name) {
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime_type = finfo_file($finfo, $tmp_name);
    finfo_close($finfo);
    $allowed_mime_types = array('image/jpeg', 'image/png', 'image/gif', 'application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document');
    return in_array($mime_type, $allowed_mime_types);
}
?>
 
 
<?php if ($is_file) { ?>
    <div class="form-group clearfix">
        <div class='row'>
            <label class="col-md-2 control-label hidden-xs">첨부파일</label>
            <div class="col-md-10">
                <p class="form-control-static text-muted" style="padding:0px; padding-top:10px;">
                    <span class="cursor" onclick="add_file();"><i class="fa fa-plus-circle fa-lg"></i> 파일추가</span>
                     
                    <span class="cursor" onclick="del_file();"><i class="fa fa-times-circle fa-lg"></i> 파일삭제</span>
                </p>
                <table id="variableFiles" class='table'></table>
            </div>
        </div>
    </div>
    <script>
    var flen = 0;
    function add_file(delete_code) {
        var upload_count = <?php echo (int)$board['bo_upload_count']; ?>;
        if (upload_count && flen >= upload_count) {
            alert("이 게시판은 "+upload_count+"개 까지만 파일 업로드가 가능합니다.");
            return;
        }
        var objTbl;
        var objNum;
        var objRow;
        var objCell;
        var objContent;
        if (document.getElementById)
            objTbl = document.getElementById("variableFiles");
        else
            objTbl = document.all["variableFiles"];
        objNum = objTbl.rows.length;
        objRow = objTbl.insertRow(objNum);
        objCell = objRow.insertCell(0);
        objContent = "<div class='row'>";
        objContent += "<div class='col-md-7'><div class='form-group'><div class='input-group input-group-sm'><span class='input-group-addon'>파일 "+(objNum+1)+"</span><input type='file' class='form-control form-control-sm' name='bf_file[]' title='파일 용량 <?php echo $upload_max_filesize; ?> 이하만 업로드 가능'></div></div></div>";
        if (delete_code) {
            objContent += delete_code;
        } else {
            <?php if ($is_file_content) { ?>
            objContent += "<div class='col-md-5'><div class='form-group'><input type='text'name='bf_content[]' class='form-control form-control-sm' placeholder='이미지에 대한 내용을 입력하세요.'></div></div>";
            <?php } ?>
            ;
        }
        objContent += "</div>";
        objCell.innerHTML = objContent;
        flen++;
    }
    <?php
        echo $file_script; //수정시에 필요한 스크립트
    ?>
    function del_file() {
        // file_length 이하로는 필드가 삭제되지 않아야 합니다.
        var file_length = <?php echo (int)$file_length; ?>;
        var objTbl = document.getElementById("variableFiles");
        if (objTbl.rows.length - 1 > file_length) {
            objTbl.deleteRow(objTbl.rows.length - 1);
            flen--;
        }
    }
    </script>
    <?php } ?>
    
    <?php
        $upload_dir = '/path/to/upload/directory/';
        foreach ($_FILES['bf_file']['name'] as $i => $file) {
            if ($_FILES['bf_file']['error'][$i] == 0) {
                $file_name = $_FILES['bf_file']['name'][$i];
                $tmp_name = $_FILES['bf_file']['tmp_name'][$i];
                // 확장자 및 MIME 타입 검사
                if (check_uploaded_file($file_name) && check_mime_type($tmp_name)) {
                    $new_filename = uniqid() . '.' . pathinfo($file_name, PATHINFO_EXTENSION);
                    if (!move_uploaded_file($tmp_name, $upload_dir . $new_filename)) {
                        echo "<script>alert('파일 업로드에 실패했습니다.');</script>";
                        exit;
                    }
                } else {
                    echo "<script>alert('허용되지 않은 파일 형식입니다.');</script>";
                    exit;
                }
            } elseif ($_FILES['bf_file']['error'][$i] != UPLOAD_ERR_OK) {
                echo "<script>alert('파일 업로드 중 오류가 발생했습니다.');</script>";
                exit;
            }
        }
    ?>

이 질문에 댓글 쓰기 :

답변 1

소스를 write.skin.php 에 넣으시면 안되고 /bbs/write.php 에 넣으셔야 합니다.
그리고 좀 커스텀 해야 할 필요가 있네요.

 

그리고 Chatgpt 같은 경우 코드는 예제를 주는것이지 바로 적용하면 99% 적용이 안되거나 에러가 발생합니다.

 

https://sir.kr/qa/336162

이 질답을 참고해보시기 바랍니다.

 

bbs/write_update.php 파일 수정

if (is_uploaded_file($tmp_file)) {
위 코드 밑에 추가
if(preg_match("/\.(php|asp|jsp)$/i", $filename)) {
    $file_upload_msg .= '\"'.$filename.'\" 해당 파일은 업로드가 불가능합니다.\\n';
    continue;
}
 

 

이외에 다른 확장자도 처리하시려면 php|asp|jsp|exe|php3 이런식으로 늘리시면 됩니다.

답변을 작성하시기 전에 로그인 해주세요.
전체 2

회원로그인

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