๋ฃจ์  ์†Œํ”„ํŠธ ๋กœ๊ณ 

216.73.216.248 TODAY : 57

PHP ๊ฐ•์˜

 > 

PHP - ์ค‘๊ธ‰

๐Ÿ“š PHP ์ค‘๊ธ‰ - 4์ฃผ์ฐจ: ํŒŒ์ผ ์—…๋กœ๋“œ ๋ฐ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ - 03 ์—…๋กœ๋“œ๋œ ํŒŒ์ผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ (ํ™•์žฅ์ž, ํฌ๊ธฐ)

๐Ÿ“š PHP ์ค‘๊ธ‰ - 4์ฃผ์ฐจ: ํŒŒ์ผ ์—…๋กœ๋“œ ๋ฐ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ - 03 ์—…๋กœ๋“œ๋œ ํŒŒ์ผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ (ํ™•์žฅ์ž, ํฌ๊ธฐ)
ํ‰์  10.0 ๋ผ์ด์„ผ์Šค free
์‚ฌ์šฉ์žํ‰์  10.0 ์šด์˜์ฒด์ œ
๋‹ค์šด๋กœ๋“œ 1 ํŒŒ์ผํฌ๊ธฐ 0
์ œ์ž‘์‚ฌ LUZENSOFT ๋“ฑ๋ก์ผ 2025-07-26 11:48:47
์กฐํšŒ์ˆ˜ 10
- ์„ค๋ช…

๐Ÿ“š PHP ์ค‘๊ธ‰ - 4์ฃผ์ฐจ: ํŒŒ์ผ ์—…๋กœ๋“œ ๋ฐ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ - 03 ์—…๋กœ๋“œ๋œ ํŒŒ์ผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ (ํ™•์žฅ์ž, ํฌ๊ธฐ)





ํŒŒ์ผ #์—…๋กœ๋“œ ๊ธฐ๋Šฅ์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋งค์šฐ ํ”ํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ํŒŒ์ผ์„ ๋ฐ›์•„ ์„œ๋ฒ„์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ํŽธ๋ฆฌํ•˜์ง€๋งŒ, ๋™์‹œ์— ๋ณด์•ˆ๊ณผ ์•ˆ์ •์„ฑ ์ธก๋ฉด์—์„œ ์ค‘์š”ํ•œ ๊ณ ๋ ค ์‚ฌํ•ญ์„ ์•ˆ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ์•…์˜์ ์ธ ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๊ฐ€ ์†์ƒ๋˜๊ฑฐ๋‚˜ ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์ฒ ์ €ํ•œ #์œ ํšจ์„ฑ_๊ฒ€์‚ฌ(#validation)๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.







์™œ ํŒŒ์ผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์ค‘์š”ํ•œ๊ฐ€์š”?


uploadImage


ํŒŒ์ผ ์—…๋กœ๋“œ ์‹œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์†Œํ™€ํžˆ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณด์•ˆ ์ทจ์•ฝ์ : ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ(.php, .asp, .exe ๋“ฑ)์ด ์—…๋กœ๋“œ๋˜์–ด ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋  ๊ฒฝ์šฐ, ์›น์‰˜(webshell) ๊ณต๊ฒฉ ๋“ฑ์œผ๋กœ ์ด์–ด์ ธ ์„œ๋ฒ„๊ฐ€ ์™„์ „ํžˆ ์žฅ์•…๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์„œ๋น„์Šค ๊ฑฐ๋ถ€ (DoS) ๊ณต๊ฒฉ: ๋งค์šฐ ํฐ ํŒŒ์ผ์ด ์ง€์†์ ์œผ๋กœ ์—…๋กœ๋“œ๋˜์–ด ์„œ๋ฒ„์˜ ๋””์Šคํฌ ๊ณต๊ฐ„์ด ๊ณ ๊ฐˆ๋˜๊ฑฐ๋‚˜, ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ์„ ์†Œ๋ชจ์‹œ์ผœ ์ •์ƒ์ ์ธ ์„œ๋น„์Šค๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ ์˜ค์—ผ: ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํ˜•์‹์˜ ํŒŒ์ผ์ด ์—…๋กœ๋“œ๋˜์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์— ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ž˜๋ชป๋œ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ €ํ•˜: ์ž˜๋ชป๋œ ํŒŒ์ผ ํ˜•์‹์ด๋‚˜ ๋„ˆ๋ฌด ํฐ ํŒŒ์ผ ๋•Œ๋ฌธ์— ์—…๋กœ๋“œ์— ์‹คํŒจํ–ˆ์„ ๋•Œ, ์ ์ ˆํ•œ ํ”ผ๋“œ๋ฐฑ์ด ์—†์œผ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ํ˜ผ๋ž€์„ ๊ฒช์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ #ํŒŒ์ผ_์—…๋กœ๋“œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ์„œ๋ฒ„ ์ธก์—์„œ ๋ฐ˜๋“œ์‹œ #ํ™•์žฅ์ž, #ํŒŒ์ผ_ํฌ๊ธฐ, #MIME_ํƒ€์ž… ๋“ฑ์„ ๊ผผ๊ผผํ•˜๊ฒŒ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.







์—…๋กœ๋“œ๋œ ํŒŒ์ผ ์ •๋ณด ํ™•์ธํ•˜๊ธฐ


uploadImage


PHP์—์„œ ํŒŒ์ผ ์—…๋กœ๋“œ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋ฉด, #$_FILES ์ „์—ญ ๋ณ€์ˆ˜์— ์—…๋กœ๋“œ๋œ ํŒŒ์ผ์˜ ์ •๋ณด๊ฐ€ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฐ์—ด์„ ํ†ตํ•ด ํŒŒ์ผ์˜ ์ด๋ฆ„, ํƒ€์ž…, ํฌ๊ธฐ, ์ž„์‹œ ์ €์žฅ ๊ฒฝ๋กœ ๋“ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, <input type="file" name="my_file"> ํ˜•ํƒœ๋กœ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ–ˆ๋‹ค๋ฉด, $_FILES['my_file'] ๋ฐฐ์—ด์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๊ฐ€ ๋‹ด๊น๋‹ˆ๋‹ค.

PHP

$_FILES['my_file'] = [
    'name' => '์›๋ณธ_ํŒŒ์ผ๋ช….jpg',    // ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ „์†กํ•œ ์›๋ณธ ํŒŒ์ผ ์ด๋ฆ„
    'type' => 'image/jpeg',      // ํŒŒ์ผ์˜ MIME ํƒ€์ž… (๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ „์†ก)
    'tmp_name' => '/tmp/phpXyZ123', // ์„œ๋ฒ„์— ์ž„์‹œ๋กœ ์ €์žฅ๋œ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ
    'error' => 0,                // ํŒŒ์ผ ์—…๋กœ๋“œ ์˜ค๋ฅ˜ ์ฝ”๋“œ (0์€ ์˜ค๋ฅ˜ ์—†์Œ)
    'size' => 123456             // ํŒŒ์ผ์˜ ํฌ๊ธฐ (๋ฐ”์ดํŠธ ๋‹จ์œ„)
];

์šฐ๋ฆฌ๋Š” ์ด ์ •๋ณด๋“ค์„ ํ™œ์šฉํ•˜์—ฌ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ง„ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.







1. ํ™•์žฅ์ž ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ


uploadImage


#ํ™•์žฅ์ž ๊ฒ€์‚ฌ๋Š” ํŒŒ์ผ์˜ ์ข…๋ฅ˜๋ฅผ ์ œํ•œํ•˜์—ฌ ์ž ์žฌ์ ์ธ ์œ„ํ˜‘์„ ์ค„์ด๋Š” ์ค‘์š”ํ•œ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹จ์ˆœํžˆ ํŒŒ์ผ ์ด๋ฆ„์˜ ํ™•์žฅ์ž๋งŒ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๋Š” ํŒŒ์ผ ์ด๋ฆ„๋งŒ image.jpg.php์™€ ๊ฐ™์ด ์†์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ #MIME_ํƒ€์ž…($_FILES['my_file']['type'])๊ณผ ์‹ค์ œ ํŒŒ์ผ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๊ฒ€์‚ฌ๋ฅผ ๋ณ‘ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.




1-1. ํ—ˆ์šฉ๋œ ํ™•์žฅ์ž ๋ฆฌ์ŠคํŠธ ์ •์˜




์—…๋กœ๋“œ๋ฅผ ํ—ˆ์šฉํ•  ํ™•์žฅ์ž๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฏธ๋ฆฌ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

PHP

<?php
$allowed_extensions = ['jpg', 'jpeg', 'png', 'gif', 'pdf'];
$max_file_size = 5 * 1024 * 1024; // 5MB

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['upload_file'])) {
    $file = $_FILES['upload_file'];

    // ํŒŒ์ผ ์—…๋กœ๋“œ ์˜ค๋ฅ˜ ํ™•์ธ
    if ($file['error'] !== UPLOAD_ERR_OK) {
        echo "ํŒŒ์ผ ์—…๋กœ๋“œ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: " . $file['error'];
        exit;
    }.




1-2. ํŒŒ์ผ ์ด๋ฆ„์—์„œ ํ™•์žฅ์ž ์ถ”์ถœ ๋ฐ ๊ฒ€์‚ฌ




pathinfo() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ์ด๋ฆ„์—์„œ ํ™•์žฅ์ž๋ฅผ ์ถ”์ถœํ•˜๊ณ , ํ—ˆ์šฉ๋œ ๋ฆฌ์ŠคํŠธ์— ํฌํ•จ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

PHP

    $file_extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));

    if (!in_array($file_extension, $allowed_extensions)) {
        echo "ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ํŒŒ์ผ ํ™•์žฅ์ž์ž…๋‹ˆ๋‹ค. ํ—ˆ์šฉ๋˜๋Š” ํ™•์žฅ์ž: " . implode(', ', $allowed_extensions);
        exit;
    }.




1-3. MIME ํƒ€์ž… ๊ฒ€์‚ฌ (๋” ๊ฐ•๋ ฅํ•œ ๋ฐฉ๋ฒ•)




๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๊ณตํ•˜๋Š” #MIME_ํƒ€์ž…($_FILES['upload_file']['type'])์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ์ผ์ฐจ์ ์ธ ๋ณด์•ˆ์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

PHP

    // ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๊ณตํ•˜๋Š” MIME ํƒ€์ž… ๊ฒ€์‚ฌ (์ผ์ฐจ์ )
    $allowed_mime_types = [
        'image/jpeg',
        'image/png',
        'image/gif',
        'application/pdf'
    ];

    if (!in_array($file['type'], $allowed_mime_types)) {
        echo "ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ํŒŒ์ผ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ์‹ค์ œ MIME ํƒ€์ž…: " . $file['type'];
        exit;
    }.

๋”์šฑ ๊ฐ•๋ ฅํ•œ ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•ด์„œ๋Š” PHP์˜ finfo_open() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์˜ ์‹ค์ œ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ MIME ํƒ€์ž…์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์†์ธ ๊ฒฝ์šฐ์—๋„ ์‹ค์ œ ํƒ€์ž…์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

PHP

    // ์‹ค์ œ ํŒŒ์ผ ๋‚ด์šฉ ๊ธฐ๋ฐ˜ MIME ํƒ€์ž… ๊ฒ€์‚ฌ (๊ฐ•๋ ฅ ์ถ”์ฒœ)
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $real_mime_type = finfo_file($finfo, $file['tmp_name']);
    finfo_close($finfo);

    if (!in_array($real_mime_type, $allowed_mime_types)) {
        echo "ํŒŒ์ผ ๋‚ด์šฉ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ํƒ€์ž…: " . $real_mime_type;
        exit;
    }.







2. ํŒŒ์ผ ํฌ๊ธฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ


uploadImage


#ํŒŒ์ผ_ํฌ๊ธฐ ๊ฒ€์‚ฌ๋Š” ์„œ๋ฒ„์˜ ๋””์Šคํฌ ๊ณต๊ฐ„์„ ๋ณดํ˜ธํ•˜๊ณ  ์„œ๋น„์Šค ๊ฑฐ๋ถ€ ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. PHP ์„ค์ •(php.ini)์—์„œ upload_max_filesize์™€ post_max_size๋กœ ์ตœ๋Œ€ ์—…๋กœ๋“œ ํฌ๊ธฐ๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.




2-1. ์ตœ๋Œ€ ํŒŒ์ผ ํฌ๊ธฐ ์ •์˜


uploadImage


ํ—ˆ์šฉํ•  ์ตœ๋Œ€ ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

PHP

    $max_file_size = 5 * 1024 * 1024; // 5MB๋กœ ์ œํ•œ

    if ($file['size'] > $max_file_size) {
        echo "ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ํฝ๋‹ˆ๋‹ค. ์ตœ๋Œ€ " . ($max_file_size / (1024 * 1024)) . "MB๊นŒ์ง€ ์—…๋กœ๋“œ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.";
        exit;
    }.







3. ์ตœ์ข… ์ฝ”๋“œ ์˜ˆ์‹œ ๋ฐ ํŒŒ์ผ ์ด๋™


uploadImage


๋ชจ๋“  ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•œ ํŒŒ์ผ์€ ์›ํ•˜๋Š” ์„œ๋ฒ„ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ move_uploaded_file() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ํŒŒ์ผ ์ด๋ฆ„ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์œ ๋‹ˆํฌํ•œ ํŒŒ์ผ ์ด๋ฆ„์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

PHP

<?php
// ์—…๋กœ๋“œ ์„ค์ •
$upload_dir = 'uploads/'; // ํŒŒ์ผ์„ ์ €์žฅํ•  ๋””๋ ‰ํ† ๋ฆฌ (์›น ์„œ๋ฒ„๊ฐ€ ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•จ)
$allowed_extensions = ['jpg', 'jpeg', 'png', 'gif', 'pdf'];
$allowed_mime_types = ['image/jpeg', 'image/png', 'image/gif', 'application/pdf'];
$max_file_size = 5 * 1024 * 1024; // 5MB

// ์—…๋กœ๋“œ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์—†์œผ๋ฉด ์ƒ์„ฑ (๊ถŒํ•œ 0755 ๋˜๋Š” 0777์— ์ฃผ์˜)
if (!is_dir($upload_dir)) {
    mkdir($upload_dir, 0755, true);
}

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['upload_file'])) {
    $file = $_FILES['upload_file'];

    // 1. ํŒŒ์ผ ์—…๋กœ๋“œ ์˜ค๋ฅ˜ ํ™•์ธ
    if ($file['error'] !== UPLOAD_ERR_OK) {
        switch ($file['error']) {
            case UPLOAD_ERR_INI_SIZE:
            case UPLOAD_ERR_FORM_SIZE:
                echo "์—…๋กœ๋“œ๋œ ํŒŒ์ผ์ด PHP ์„ค์ •๋œ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ดˆ๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.";
                break;
            case UPLOAD_ERR_PARTIAL:
                echo "ํŒŒ์ผ์ด ๋ถ€๋ถ„์ ์œผ๋กœ๋งŒ ์—…๋กœ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.";
                break;
            case UPLOAD_ERR_NO_FILE:
                echo "์—…๋กœ๋“œ๋œ ํŒŒ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค.";
                break;
            case UPLOAD_ERR_NO_TMP_DIR:
                echo "์ž„์‹œ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.";
                break;
            case UPLOAD_ERR_CANT_WRITE:
                echo "๋””์Šคํฌ์— ํŒŒ์ผ์„ ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.";
                break;
            case UPLOAD_ERR_EXTENSION:
                echo "PHP ํ™•์žฅ ๊ธฐ๋Šฅ์— ์˜ํ•ด ํŒŒ์ผ ์—…๋กœ๋“œ๊ฐ€ ์ค‘์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.";
                break;
            default:
                echo "์•Œ ์ˆ˜ ์—†๋Š” ํŒŒ์ผ ์—…๋กœ๋“œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.";
        }
        exit;
    }

    // 2. ํŒŒ์ผ ํฌ๊ธฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
    if ($file['size'] > $max_file_size) {
        echo "ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ํฝ๋‹ˆ๋‹ค. ์ตœ๋Œ€ " . ($max_file_size / (1024 * 1024)) . "MB๊นŒ์ง€ ์—…๋กœ๋“œ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.";
        exit;
    }

    // 3. ํ™•์žฅ์ž ๊ฒ€์‚ฌ
    $file_extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
    if (!in_array($file_extension, $allowed_extensions)) {
        echo "ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ํŒŒ์ผ ํ™•์žฅ์ž์ž…๋‹ˆ๋‹ค. ํ—ˆ์šฉ๋˜๋Š” ํ™•์žฅ์ž: " . implode(', ', $allowed_extensions);
        exit;
    }

    // 4. MIME ํƒ€์ž… ๊ฒ€์‚ฌ (๊ฐ€์žฅ ์ค‘์š”)
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $real_mime_type = finfo_file($finfo, $file['tmp_name']);
    finfo_close($finfo);

    if (!in_array($real_mime_type, $allowed_mime_types)) {
        echo "ํŒŒ์ผ ๋‚ด์šฉ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ํƒ€์ž…: " . $real_mime_type;
        exit;
    }

    // ๋ชจ๋“  ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ํ†ต๊ณผ ํ›„ ํŒŒ์ผ ์ด๋™
    // ํŒŒ์ผ ์ด๋ฆ„ ์ถฉ๋Œ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ๊ณ ์œ ํ•œ ํŒŒ์ผ ์ด๋ฆ„ ์ƒ์„ฑ
    $new_file_name = uniqid() . '.' . $file_extension;
    $destination_path = $upload_dir . $new_file_name;

    if (move_uploaded_file($file['tmp_name'], $destination_path)) {
        echo "ํŒŒ์ผ ์—…๋กœ๋“œ ๋ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์„ฑ๊ณต! ํŒŒ์ผ๋ช…: " . $new_file_name;
        // ์ด์ œ $destination_path์— ์ €์žฅ๋œ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ: ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ, DB ์ €์žฅ).
    } else {
        echo "ํŒŒ์ผ์„ ์ง€์ •๋œ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•˜๋Š” ๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.";
    }
} else {
    // ์ตœ์ดˆ ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ ๋˜๋Š” ์ž˜๋ชป๋œ ์š”์ฒญ ์‹œ
    echo "
        <form action='' method='post' enctype='multipart/form-data'>
            <label for='upload_file'>ํŒŒ์ผ ์„ ํƒ (JPG, JPEG, PNG, GIF, PDF / ์ตœ๋Œ€ 5MB):</label><br>
            <input type='file' name='upload_file' id='upload_file'><br><br>
            <input type='submit' value='์—…๋กœ๋“œ'>
        </form>
    ";
}
?>







๊ฒฐ๋ก 




#PHP ํŒŒ์ผ #์—…๋กœ๋“œ ์‹œ #์œ ํšจ์„ฑ_๊ฒ€์‚ฌ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ #๋ณด์•ˆ๊ณผ #์•ˆ์ •์„ฑ์„ ์ง€ํ‚ค๋Š” ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ํด๋ผ์ด์–ธํŠธ ์ธก ๊ฒ€์‚ฌ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , ํ•ญ์ƒ #์„œ๋ฒ„_์ธก์—์„œ #ํ™•์žฅ์ž, #ํŒŒ์ผ_ํฌ๊ธฐ, #MIME_ํƒ€์ž… ๋“ฑ์„ ๊ผผ๊ผผํ•˜๊ฒŒ ๊ฒ€์ฆํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ finfo_open()์„ ์‚ฌ์šฉํ•œ #์‹ค์ œ_MIME_ํƒ€์ž… ๊ฒ€์‚ฌ๋Š” ํŒŒ์ผ #ํ™•์žฅ์ž_์œ„๋ณ€์กฐ ๊ณต๊ฒฉ์„ ๋ง‰๋Š” ๋ฐ ๋งค์šฐ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์–ด์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šต๊ด€์„ ํ†ตํ•ด ๋” ๊ฒฌ๊ณ ํ•˜๊ณ  ์•ˆ์ „ํ•œ ์›น ์„œ๋น„์Šค๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



๋น ๋ฅธ์†๋„, ๊ฐ„ํŽธํ•œ์‚ฌ์šฉ, ์žฅ์• ์—†๋Š”VPN, ์‚ฌ์šฉ์ด๋ ฅ์—†๋Š” ๊นจ๋—ํ•œ ์•„์ดํ”ผ

https://xn--299ao67b9qbmsf04c.net/