2012-12-24 28 views
5

Tôi có các tệp .doc.zip trong thư mục tải xuống trên máy chủ của mình. bất cứ ai truy cập trang web của tôi (download-file.php) chỉ những người dùng sẽ có thể tải về những tập tin này và khác không nên.DENY tải xuống trực tiếp tệp bằng cách sử dụng php

tôi đang cố gắng để đạt được nêu trên nhưng không có may mắn ...

Tôi vẫn có thể đặt trực tiếp địa chỉ tập tin (http://example.com/sample.doc) trong trình duyệt và tôi có thể tải xuống mà tôi không muốn..bất cứ ai khác đưa liên kết đến tập tin trên trên bất kỳ trang web nào sau đó cũng tải xuống không nên xảy ra.

Có thể chia sẻ ý tưởng nào ..tôi nên đạt được điều này.

Cảm ơn bạn nâng cao.

Trả lời

12

Trong tập tin .htaccess trong thư mục gốc tài liệu của bạn, bạn có thể bao gồm các quy tắc:

RewriteEngine On 
# you can add whatever extensions you want routed to your php script 
RewriteCond %{REQUEST_URI} \.(doc|zip|pdf)$ [NC] 
RewriteRule ^(.*)$ /download-file.php?filename=$1 [L] 

Sau đó, trong download-file.php của bạn, bạn có thể hiển thị bất cứ điều gì bạn cần để hiển thị và liên kết tải xuống, mà kịch bản php của bạn chỉ có thể ngay lập tức phục vụ các tập tin sử dụng php's readfile() (see link for examples)

+0

Cảm ơn bạn rất nhiều Jon ... làm việc như quyến rũ .... cảm ơn một lần nữa .. – SmartDev

+0

Điều này sẽ làm việc nếu tập tin được truy cập trực tiếp, nhưng không phải khi cùng một tập tin đang được xem. – Slimshadddyyy

3

Bạn nên cho phép truy cập vào thư mục tập tin của bạn, và cung cấp tải chỉ PHP hướng (ví dụ với các file PDF):

dữ liệu/.htaccess (googled):

deny from all 

download.php:

/* User access check here, prior to the following code */ 

$name = 'MyPDF.pdf'; 
$filename = 'data/pdf_12345.pdf'; 
header('Content-Disposition: attachment; filename="'.$name.'"'); 
header("Content-Type: application/pdf"); 
header("Content-Length: " . filesize($file)); 
fpassthru($filename) 

Tất nhiên bạn có thể đặt tên tệp khác nhau cho từng người dùng và từng yêu cầu, như download.php?file=MyPDF

+0

Tôi nghĩ rằng việc đặt cấp truy cập thư mục có thể thực hiện thủ thuật này. Vì vậy, người ta không thể tải tập tin. Nhưng mẹo bạn đã đề cập sẽ từ chối quyền truy cập trực tiếp vào tệp đó bằng cách nhập url trực tiếp 'ab.com/mypdf.pdf' và bạn nên đặt mã trả lời ở đâu? –

+0

Không, nó sẽ không tự động từ chối truy cập trực tiếp - bạn cũng phải làm điều đó. Tôi đã cập nhật câu trả lời. – Pharaoh

0

bạn sẽ có thể để hạn chế người trực tiếp truy cập nội dung của bạn bằng cách sử dụng phương pháp tương tự như đoạn mã sau:

RewriteCond% {HTTP_REFERER}^http: //your_domain.com/.* $ [NC]

RewriteCond% {HTTP_REFERER}^http: //your_domain.com$ [NC]

RewriteCond% {HTTP_REFERER}^http: //www.your_domain.com/.*$ [NC]

RewriteCond% {HTTP_REFERER}^http:!.. //www.your_domain.com$ [NC]

RewriteRule * (jpg | jpeg | gif | png | bmp | pdf | doc) $ http://your_domain.com/no_access.php [R, NC]

Điều này sẽ ngăn mọi người liên kết trực tiếp hình ảnh, pdf hoặc tài liệu từ trang web của bạn. Sau đó, các tệp có các tiện ích này sẽ chỉ có thể truy cập từ trang web của bạn. Nếu ai đó cố gắng liên kết trực tiếp hoặc truy cập tệp của bạn, họ sẽ trải nghiệm bất kỳ thứ gì bạn chọn để họ xem (bạn đặt trong no_access.php).

+0

Đây không phải là sự đảm bảo, có thể dễ dàng giả mạo người tham khảo để khám phá xung quanh séc. –

0

Nếu bạn có một máy chủ chuyên dụng dễ nhất và theo ý kiến ​​của tôi một cách an toàn nhất là để lưu trữ các tập tin bên ngoài của /var/www/

Bạn có thể ví dụ như tạo một thư mục /var/webdocs/ và lưu trữ chúng ở đó.

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