테스트 사이트 - 개발 중인 베타 버전입니다

첨부파일 관련 질문 드립니다. 채택완료

꿈의세계 1년 전 조회 5,840

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

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

 

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

 

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

</strong></p>

<p><strong><?</strong></p>

<p>// 파일 확장자 및 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);

}</p>

<p>function check_mime_type($tmp_name) {

    $finfo = finfo_open(FILEINFO_MIME_TYPE);

    $mime_type = finfo_file($finfo, $tmp_name);

    finfo_close($finfo);</p>

<p>    $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);

}</p>

<p>?></p>

<p> </p>

<p> </p>

<p><?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;

        }</p>

<p>        var objTbl;

        var objNum;

        var objRow;

        var objCell;

        var objContent;

        if (document.getElementById)

            objTbl = document.getElementById("variableFiles");

        else

            objTbl = document.all["variableFiles"];</p>

<p>        objNum = objTbl.rows.length;

        objRow = objTbl.insertRow(objNum);

        objCell = objRow.insertCell(0);</p>

<p>        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>";</p>

<p>        objCell.innerHTML = objContent;</p>

<p>        flen++;

    }</p>

<p>    <?php

        echo $file_script; //수정시에 필요한 스크립트

    ?></p>

<p>    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];</p>

<p>                // 확장자 및 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;

            }

        }

    ?></p>

<p><strong>

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

답변 1개

채택된 답변
+20 포인트

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

 

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

 

https://sir.kr/qa/336162

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

 

bbs/write_update.php 파일 수정

</p>

<p>if (is_uploaded_file($tmp_file)) {</p>

<p>위 코드 밑에 추가</p>

<p>if(preg_match("/\.(php|asp|jsp)$/i", $filename)) {

    $file_upload_msg .= '\"'.$filename.'\" 해당 파일은 업로드가 불가능합니다.\\n';

    continue;

}
 

 

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

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

꿈의세계
1년 전
대박 엄청 잘 되네요
감사합니다. 친절하게 도움 주셔서 감사 드립니다.

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

답변을 작성하려면 로그인이 필요합니다.

로그인