Bảo vệ file Upload khi người dùng không đăng nhập WordPress
Quản lý việc tải lên thế nào khi người dùng không đăng nhập?
Các vấn đề liên quan tới thông tin, nội dung của website bạn hoàn toàn có thể quản lý ngay trong phần quản trị của trang web. Tuy nhiên, những nội dung mà những người dùng/ khách vãng lai đăng lên trang web của bạn làm sao để có thể quản lý được.
Thông thường, người dùng sẽ phải đăng nhập để tải lên các thông tin cần thiết ở một website nào đó. Bên cạnh đó, một số website không bắt buộc người dùng phải đăng nhập mới có quyền đăng tải. Bởi vậy, việc quản lý thông tin tải lên khi người dùng không đăng nhập là điều biên tập viên/ quản trị website phải thực sự lưu ý.
Những dữ liệu tải lên khi người dùng không đăng nhập sẽ có thể gây ảnh hưởng tới tài nguyên website của bạn. Cũng có thể, một đối tượng xấu mặt muốn thông qua việc đăng tải để truy cập vào hệ thống dữ liệu website. Nếu chỉ kiểm tra cookie có tồn tại hay không chưa hẳn là một điều có thể bảo vệ được website của bạn.
Một số ý kiến cho rằng dùng .htacess
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} ^.*uploads/private/.* RewriteCond %{HTTP_COOKIE} !^.*wordpress_logged_in.*$ [NC] RewriteRule . /index.php [R,L] RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
Để tăng khả năng bảo vệ, bạn có thể cài đặt chế độ tường lửa “proxy” cho tất cả yêu cầu vào thư mục được tải lên thông qua một tập lệnh php:
RewriteCond %{REQUEST_FILENAME} -s RewriteRule ^wp-content/uploads/(.*)$ dl-file.php?file=$1 [QSA,L]
Sau khi bạn thiết lập chế độ tường lửa, tất cả các yêu cầu tải lên tệp bao gồm cả hình ảnh lẫn nội dung sẽ đi đến dl-file.php đó. Thông qua dữ liệu này, bạn có thể xác minh nếu người dùng đăng nhập hay không.
Các bạn có thể tham khảo ở đây ms-files.php
<pre><?php /* * dl-file.php * * Protect uploaded files with login. * * @link http://wordpress.stackexchange.com/questions/37144/protect-wordpress-uploads-if-user-is-not-logged-in * * @author hakre <http://hakre.wordpress.com/> * @license GPL-3.0+ * @registry SPDX */ require_once('wp-load.php'); is_user_logged_in() || auth_redirect(); list($basedir) = array_values(array_intersect_key(wp_upload_dir(), array('basedir' => 1)))+array(NULL); $file = rtrim($basedir,'/').'/'.str_replace('..', '', isset($_GET[ 'file' ])?$_GET[ 'file' ]:''); if (!$basedir || !is_file($file)) { status_header(404); die('404 — File not found.'); } $mime = wp_check_filetype($file); if( false === $mime[ 'type' ] && function_exists( 'mime_content_type' ) ) $mime[ 'type' ] = mime_content_type( $file ); if( $mime[ 'type' ] ) $mimetype = $mime[ 'type' ]; else $mimetype = 'image/' . substr( $file, strrpos( $file, '.' ) + 1 ); header( 'Content-Type: ' . $mimetype ); // always send this if ( false === strpos( $_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS' ) ) header( 'Content-Length: ' . filesize( $file ) ); $last_modified = gmdate( 'D, d M Y H:i:s', filemtime( $file ) ); $etag = '"' . md5( $last_modified ) . '"'; header( "Last-Modified: $last_modified GMT" ); header( 'ETag: ' . $etag ); header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', time() + 100000000 ) . ' GMT' ); // Support for Conditional GET $client_etag = isset( $_SERVER['HTTP_IF_NONE_MATCH'] ) ? stripslashes( $_SERVER['HTTP_IF_NONE_MATCH'] ) : false; if( ! isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) ) $_SERVER['HTTP_IF_MODIFIED_SINCE'] = false; $client_last_modified = trim( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ); // If string is empty, return 0. If not, attempt to parse into a timestamp $client_modified_timestamp = $client_last_modified ? strtotime( $client_last_modified ) : 0; // Make a timestamp for our most recent modification... $modified_timestamp = strtotime($last_modified); if ( ( $client_last_modified && $client_etag ) ? ( ( $client_modified_timestamp >= $modified_timestamp) && ( $client_etag == $etag ) ) : ( ( $client_modified_timestamp >= $modified_timestamp) || ( $client_etag == $etag ) ) ) { status_header( 304 ); exit; } // If we made it this far, just serve the file readfile( $file );</pre>
Nếu người dùng không đăng nhập, mẫu đăng nhập trang web của bạn sẽ được hiển thị. Sau khi người dùng đăng nhập, họ sẽ được chuyển hướng trở lại tập tin và có thể tải xuống ngay bây giờ.
Bạn sẽ tìm được thông tin hữu ích liên quan tới người dùng tải tệp lên trong \wp-includes\ms-files.php cài đặt wordpress của bạn, nhưng một trong số đó là dành cho multisite và w / o đăng nhập kiểm tra và chuyển hướng.
Tùy thuộc vào lượng truy cập bạn có, có thể tùy chỉnh để tích hợp tốt hơn với máy chủ của bạn, ví dụ như X-Accel-Redirect hoặc X-Sendfile tiêu đề.
Việc bảo vệ nguồn tài nguyên website là rất quan trọng, bởi vậy bạn cần thực hiện xây dựng công cụ bảo vệ một cách tốt nhất mà vẫn tối ưu được website, mang đến sự tiện dụng cho người dùng.