2011-10-09 34 views
7

Để bảo mật, tôi đang di chuyển một tập hợp các tệp và thư mục ra bên ngoài gốc web trên máy chủ apache, sau đó tôi sẽ phục vụ chúng theo cách động. Điều này có vẻ tốt hơn 2 lựa chọn thay thế:Làm cách nào để phân phối tài liệu từ bên ngoài web root bằng cách sử dụng PHP?

  1. Để chúng có thể truy cập web và chỉ tạo trang đăng nhập php được thêm vào mỗi tệp. Vấn đề là chúng không phải là tất cả các tệp php và tôi không thể thêm tệp đăng nhập php vào pdf, hình ảnh, v.v.
  2. Cho phép chúng truy cập web và sử dụng xác thực HTTP để hạn chế quyền truy cập vào toàn bộ thư mục. Nhưng điều đó giới thiệu các vấn đề bao gồm mật khẩu rõ ràng, không có phương thức đăng xuất duyên dáng, v.v.

Vì vậy, chúng tôi quay lại để chúng bên ngoài gốc web nhưng phục vụ chúng một cách linh động. Vấn đề tôi gặp phải là vì chúng là tất cả các loại tệp khác nhau (tập lệnh php, txt, pdf, jpg) Tôi không chắc liệu mình có nên sử dụng include() hoặc readfile() hay không. Và tôi gặp sự cố khi gửi tiêu đề phù hợp cho mọi tệp để trình duyệt hiển thị chính xác.

Tôi có thiếu giải pháp ma thuật khác không? Có một khuôn khổ nào đã giúp tôi xử lý việc phân phát các tệp và tiêu đề động không?

(FYI Tôi đang chạy Linux, Apache & PHP trên một máy chủ chia sẻ)

+1

Chà, bạn đang sử dụng một vấn đề dễ dàng và biến nó thành một vấn đề khó khăn. –

+2

@Dietrich đâu là giải pháp dễ dàng? –

+0

@Pekka: Xác thực HTTP Digest, yêu cầu người dùng đóng trình duyệt của họ để đăng xuất. –

Trả lời

8

Tôi nghĩ rằng một cái gì đó như thế này sẽ làm việc:

<?php 
$path = realpath(dirname(__FILE__) . '/../my_files/' . $_GET['file']); 

$parts = explode('/', pathinfo($path, PATHINFO_DIRNAME)); 
if (end($parts) !== 'my_files') { 
    // LFI attempt 
    exit(); 
} 

if (!is_file($path)) { 
    // file does not exist 
    exit(); 
} 

header('Content-Type: ' . mime_content_type($path)); 
header('Content-Length: ' . filesize($path)); 

readfile($path); 
+1

Tôi sẽ thay thế 'mime_content_type()' bằng các hàm fileinfo, nhưng nếu không thì có. –

0

Cách đơn giản nhất tôi có thể nghĩ đến là sử dụng. tập tin htaccess. Giả sử máy chủ web của bạn là Apache, tất nhiên.

Bạn có thể từ chối truy cập vào bất kỳ loại tệp và/hoặc thư mục nào cho tất cả mọi người và chỉ cho phép đối với máy chủ cục bộ. Bằng cách này, họ sẽ không được phục vụ cho công chúng, ngay cả khi họ biết đường dẫn/url chính xác, nhưng máy chủ và PHP sẽ có thể phục vụ chúng.

Đối với các máy chủ web khác nhau, phải có các giải pháp tương đương. Ngoài ra, bạn luôn có thể chuyển sang Apache :-)

+0

Vâng, ẩn các tập tin từ công chúng không phải là vấn đề. Di chuyển chúng bên ngoài gốc web hoặc hạn chế quyền truy cập bằng cách sử dụng .htaccess tương đương với tôi. Vấn đề của tôi là một phương pháp tốt để phân phối có chọn lọc các tệp đó khi cần, cho người dùng được ủy quyền. – Andrew

+0

... và có thể không sử dụng xác thực http đơn giản. Nếu không, .htaccess vẫn sẽ là một tùy chọn. – GolezTrol

+0

Hai vấn đề là độc lập ...Nhưng kể từ khi bạn lấy một đoạn văn để giải thích sự lựa chọn của bạn di chuyển chúng ra khỏi gốc web, tôi nghĩ tôi sẽ chỉ ra rằng đây không phải là một bước cần thiết. Cụ thể là, khi bạn nói "... vì an ninh, tôi đang di chuyển ...", đó không phải là một lý do hoặc biện pháp chính xác. –

Các vấn đề liên quan