Programming/PHP

리소스 직접 접근 차단하고 소스에서만 허용하기 (PHP + .htaccess)

고고마코드 2023. 11. 23. 22:18
반응형

출발점

이 글을 작성한 이유는 www.example.com/file/font.ttf 에 폰트가 저장되어 있고, 해당 url로 접근하면 폰트를 직접 접근하여 탈취할 수 있기 때문에 이를 방지하고 싶었습니다.

소스에서는 접근이 가능해야 하고, 외부에서 url을 통해 직접 접근하는 것은 막아야 했습니다.

.htaccess

우선 직접 접근을 막는 방법은 간단합니다.
디렉토리가 file 이면 해당 디렉토리에 .htaccess에 아래 코드를 추가합니다.
만약 .htaccess가 없다면 새로 만들어서 추가합니다.

<FilesMatch "\.(ttf|otf|eot|woff)$">
    Order Allow,Deny
    Deny from all
</FilesMatch>

차단하고자 하는 확장자를 모두 추가합니다.

PHP

이제 file을 읽어올 PHP소스를 작성합니다.
예를 들어 fileLoader.php 로 작성했습니다.

<?php
// 파일 이름 설정
$filename = $_REQUEST['filename'] ?? ''
$file = "your_dir/file/{$filename}";

// 파일 유형에 따른 MIME 타입 설정
$mimeType = 'application/font-sfnt';

// 파일 존재 여부 확인
if (file_exists($file)) {
    // 적절한 HTTP 헤더 전송
    header('Content-Type: ' . $mimeType);
    header('Content-Length: ' . filesize($file));

    // 파일 읽기 및 출력
    readfile($file);
    exit;
} else {
    // 파일이 없을 경우 에러 메시지 전송
    header("HTTP/1.0 404 Not Found");
    exit;
}
?>

폰트 호출하는 곳

폰트 호출하는 곳에서 PHP 스크립트를 호출하면 됩니다.

@font-face {
    font-family: 'font.ttf';
    src: url('fileLoader.php?filename=font.ttf') format('truetype');
}

만약 fileLoader.php에 직접 접근하더라도 폰트에는 접근할 수는 없습니다.

유형별 MIME 타입

확장자 유형별 MIIME 타입을 정리하고 끝내겠습니다.

폰트

  1. TrueType Font (TTF)
    • MIME 타입: application/font-sfnt
  2. OpenType Font (OTF)
    • MIME 타입: application/font-sfnt
  3. Web Open Font Format (WOFF)
    • MIME 타입: application/font-woff
  4. Web Open Font Format 2 (WOFF2)
    • MIME 타입: font/woff2
  5. Scalable Vector Graphics Font (SVG Font)
    • MIME 타입: image/svg+xml

이미지

  1. JPEG Image
    • MIME 타입: image/jpeg
  2. PNG Image
    • MIME 타입: image/png
  3. GIF Image
    • MIME 타입: image/gif
  4. BMP Image
    • MIME 타입: image/bmp
  5. WebP Image
    • MIME 타입: image/webp
  6. SVG Image
    • MIME 타입: image/svg+xml

동영상

  1. MP4 (MPEG-4 Part 14)
    • MIME 타입: video/mp4
  2. WebM
    • MIME 타입: video/webm
  3. Ogg (Theora 또는 Vorbis 코덱 사용)
    • MIME 타입: video/ogg
  4. AVI (Audio Video Interleave)
    • MIME 타입: video/x-msvideo
  5. QuickTime
    • MIME 타입: video/quicktime
  6. 3GP (3rd Generation Partnership Project)
    • MIME 타입: video/3gpp (비디오가 주된 내용일 경우)
    • MIME 타입: audio/3gpp (오디오만 있거나 오디오가 주된 내용일 경우)
  7. FLV (Flash Video)
    • MIME 타입: video/x-flv
  8. MPEG (Moving Picture Experts Group)
    • MIME 타입: video/mpeg
반응형