Gần đây tôi đã có một vấn đề liên quan và đã viết bài viết này về nó .
Tôi sẽ cho rằng các phần tải xuống được tải lên thông qua xử lý phương tiện của WordPress - hoặc nếu không, bạn có ID đính kèm để tải xuống.
Đề cương giải pháp
- Làm cho thư mục tải lên 'an toàn' (Theo nghĩa này tôi chỉ có nghĩa là sử dụng
.htaccess
để chặn mọi nỗ lực truy cập trực tiếp các tệp trong thư mục tải lên (hoặc thư mục con của chúng) - ví dụ: thông qua mysite.com/wp-content/uploads/conf/2012/09/myconfidentialfile.pdf
)
- Tạo liên kết tải xuống bao gồm ID tệp đính kèm - điều này đi qua WordPress để kiểm tra quyền của người dùng để xem tệp đính kèm cho phép / từ chối quyền truy cập.
Hãy cẩn thận
- Điều này làm cho việc sử dụng
.htaccess
để cung cấp bảo mật . Nếu điều này không khả dụng / bật (ví dụ máy chủ nginx), thì bạn sẽ không nhận được nhiều bảo mật. Bạn có thể ngăn người dùng duyệt thư mục uplods. Nhưng truy cập trực tiếp sẽ làm việc.
- Theo như trên. Điều này không nên được sử dụng trong phân phối nếu bạn yêu cầu bảo mật tuyệt đối . Sẽ ổn nếu thiết lập cụ thể của bạn hoạt động - nhưng nói chung, nó không thể được đảm bảo. Bài viết liên kết của tôi là một phần cố gắng để giải quyết điều này.
- Bạn sẽ mất hình thu nhỏ . Chặn truy cập trực tiếp vào một thư mục hoặc thư mục con sẽ có nghĩa là hình thu nhỏ của các tệp trong thư mục đó không thể được xem. Bài viết liên kết của tôi là một phần cố gắng để giải quyết điều này.
Chặn truy cập trực tiếp
Để thực hiện việc này trong thư mục tải lên của bạn (hoặc thư mục con - tất cả tài liệu bí mật phải nằm ở bất kỳ độ sâu nào trong thư mục này). Đặt một .htaccess
tệp với các mục sau:
Order Deny,Allow
Deny from all
Sau đây tôi giả sử rằng bạn sẽ đính kèm tài liệu bí mật vào loại bài 'khách hàng'. Bất kỳ phương tiện nào được tải lên trên trang chỉnh sửa máy khách sẽ được lưu trữ trong uploads/conf/
thư mục
Chức năng thiết lập thư mục tải lên được bảo vệ
function wpse26342_setup_uploads_dir(){
$wp_upload_dir = wp_upload_dir();
$protected_folder = trailingslashit($wp_upload_dir['basedir']) . 'conf';
// Do not allow direct access to files in protected folder
// Add rules to /uploads/conf/.htacess
$rules = "Order Deny,Allow\n";
$rules .= "Deny from all";
if( ! @file_get_contents( trailingslashit($protected_folder).'.htaccess' ) ) {
//Protected directory doesn't exist - create it.
wp_mkdir_p( $protected_folder);
}
@file_put_contents( trailingslashit($protected_folder).'.htaccess', $rules );
//Optional add blank index.php file to each sub-folder of protected folder.
}
Tải lên tài liệu mật
/**
* Checks if content is being uploaded on the client edit-page
* Calls a function to ensure the protected file has the .htaccess rules
* Filters the upload destination to the protected file
*/
add_action('admin_init', 'wpse26342_maybe_change_uploads_dir', 999);
function wpse26342_maybe_change_uploads_dir() {
global $pagenow;
if ( ! empty( $_POST['post_id'] ) && ( 'async-upload.php' == $pagenow || 'media-upload.php' == $pagenow ) ) {
if ( 'client' == get_post_type( $_REQUEST['post_id'] ) ) {
//Uploading content on the edit-client page
//Make sure uploads directory is protected
wpse26342_setup_uploads_dir();
//Change the destination of the uploaded file to protected directory.
add_filter( 'upload_dir', 'wpse26342_set_uploads_dir' );
}
}
}
Làm xong việc đó, nội dung được tải lên sẽ ở bên trong uploads/conf
và cố gắng truy cập trực tiếp vào nó bằng trình duyệt của bạn sẽ không hoạt động.
Đang tải xuống nội dung
Điều này thật dễ dàng. Url tải xuống có thể là một cái gì đó www.site.com?wpse26342download=5
(trong đó 5 là ID đính kèm của nội dung được tải lên). Chúng tôi sử dụng điều này để xác định tệp đính kèm, kiểm tra quyền của người dùng hiện tại và cho phép họ tải xuống.
Đầu tiên, thiết lập biến truy vấn
/**
* Adds wpse26342download to the public query variables
* This is used for the public download url
*/
add_action('query_vars','wpse26342_add_download_qv');
function wpse26342_add_download_qv( $qv ){
$qv[] = 'wpse26342download';
return $qv;
}}
Bây giờ hãy thiết lập trình nghe để (có thể) kích hoạt tải xuống ...
add_action('request','wpse26342_trigger_download');
function wpse26342_trigger_download( $query_vars ){
//Only continue if the query variable set and user is logged in...
if( !empty($query_vars['wpse26342download']) && is_user_logged_in() ){
//Get attachment download path
$attachment = (int) $query_vars['wpse26342download'];
$file = get_attached_file($attachment);
if( !$file )
return;
//Check if user has permission to download. If not abort.
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit();
}
return $query_vars;
}
Nhận xét cuối cùng
Đoạn mã trên có thể chứa lỗi / lỗi cú pháp và chưa được kiểm tra, và bạn tự chịu rủi ro khi sử dụng nó :).
Url tải xuống có thể được 'chỉnh sửa' bằng cách viết lại. Như đã nêu trong các bình luận, bạn có thể thêm một khoảng trống index.php
bên trong mỗi đứa trẻ của thư mục được bảo vệ để ngăn chặn việc duyệt - nhưng dù sao thì điều này cũng nên được ngăn chặn bởi các .htaccess
quy tắc.
Một phương pháp an toàn hơn sẽ là lưu trữ các tệp công khai bên ngoài một thư mục công cộng. Hoặc trên một dịch vụ bên ngoài như Amazon S3. Để sau này, bạn sẽ cần tạo một url hợp lệ để tìm nạp tệp từ Amazon (sử dụng khóa riêng của bạn). Cả hai điều này đòi hỏi một mức độ tin cậy nhất định đối với dịch vụ Máy chủ / bên thứ ba của bạn.
Tôi sẽ cảnh giác về việc sử dụng bất kỳ plugin nào đề xuất họ cung cấp 'tải xuống được bảo vệ'. Tôi đã không tìm thấy bất kỳ cung cấp bảo mật đủ tốt. Xin vui lòng không cảnh báo về giải pháp này - và tôi hoan nghênh mọi đề xuất hoặc chỉ trích.