如何保护主站点子域中的文件免于在WordPress中未经身份验证的情况下下载

时间:2018-08-28 08:26:57

标签: php wordpress .htaccess

例如,我的主域p是一个文件共享网站,我们将文件保留在cat <<EOF | START This is a sample paragraph that has special characters like new lines spaces, tabs, quotes "abc", equals =, angular brackets <abc>, front slash / and might contain the starting string that should be ignored START and END START dfgfah END EOF sed -n ' :head /^START/{ :start n $q /^END/{ s/^/START New text / p n :tail p $q n b tail } b start } p $q n b head ' www.example.com之类的子域中,以与访问者共享。我的问题是如何直接保护子域(子域可能指向不同的服务器或主机)上的文件,而无需在wordpress / mainsite中进行身份验证即可下载。

我当前的代码功劳归于server1.example.com

.htaccess文件

server2.example.com

所以我的整个.htaccess代码看起来像

http://wordpress.stackexchange.com/a/37743/12438

但它只能保护RewriteCond %{REQUEST_FILENAME} -s RewriteRule ^wp-content/uploads/(.*)$ dl-file.php?file=$1 [QSA,L] 中的文件 这是# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] # BEGIN THIS DL-FILE.PHP ADDITION RewriteCond %{REQUEST_URI} ^.*wp-content/uploads/.* RewriteRule ^wp-content/uploads/(.*)$ dl-file.php?file=$1 [QSA,L] # END THIS DL-FILE.PHP ADDITION RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress Options -Indexes

wp-content/uploads/*

2 个答案:

答案 0 :(得分:1)

将受保护的文件放在网站的公共访问区域之外的私有文件夹中。然后,制作一个下载页面,该页面在url或其他内容中带有文件名。然后在该页面上,进行身份验证检查:

is_user_logged_in() ||  auth_redirect();
// open file
// send headers
// echo contents

答案 1 :(得分:1)

第1步:

将以下内容添加到所有子域的'.htaccess'

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s

RewriteCond %{QUERY_STRING} !key=(FgTyUeL)
RewriteRule ^(.*)$ http://www.example.com/?dwnld_file=server1/$1 [QSA,L]

在上面的代码中,我们将所有文件重定向到主域,除非设置了 post 参数。例如,http://server1.example.com/file.pdf将被重定向到http://www.example.com/?dwnld_file=server1/file.pdf。这里server1是您的子域名,以便确定是否有多个子域。

在重写条件下-RewriteCond %{QUERY_STRING} !key=(FgTyUeL)key及其值FgTyUeL应该是机密的,可以随时更改为更复杂的字符串。我们将使用它来访问WordPress中的文件。

第2步:

将它们添加到您的主题的主域的“ functions.php”中。

/* init hook to check whether user logged-in and pass to download function */
add_action( 'init', 'file_init' );
function file_init() {
    if ($_REQUEST[ 'dwnld_file' ] != '') {
        if ( ! is_user_logged_in() ) { // if not logged-in
            auth_redirect(); //redirect to login page
            // wp_redirect( 'http://www.example.com/login' ); // or some other page
            exit;
        }
        else {
            $spliturl = explode("/",$_REQUEST[ 'dwnld_file' ]);
            $originalurl = "http://".$spliturl[0].".example.com/".substr($_REQUEST[ 'dwnld_file' ], strpos($_REQUEST[ 'dwnld_file' ], "/") + 1);                
            check_download_file( $originalurl ); // if logged-in pass file to download
        }
    }
}

/* function to download file */
function check_download_file( $url ) {
    $key='?key=FgTyUeL'; // secure post key same as .htaccess
    $file = basename($url);
    $mime = wp_check_filetype( $file ); 

    if( false === $mime[ 'type' ] && function_exists( 'mime_content_type' ) )
        $mime[ 'type' ] = mime_content_type( $file );

    if( $mime[ 'type' ] )
    {           
        set_time_limit(0);
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url.$key);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        $curl_response = curl_exec($ch);

        curl_close($ch);
        header('Expires: 0'); // no cache
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Last-Modified: ' . gmdate('D, d M Y H:i:s', time()) . ' GMT');
        header('Cache-Control: private', false);
        header('Content-Type: application/force-download');
        header('Content-Disposition: attachment; filename="' . basename($url) . '"');
        header('Content-Transfer-Encoding: binary');
        header('Content-Length: ' . strlen($curl_response)); // provide file size
        header('Connection: close');
        echo $curl_response;
        die();            
    }
}

以上功能是不言自明的-我们正在检查WordPress身份验证,如果已登录用户,我们将附加安全密钥并使用cURL下载文件。请注意,该安全密钥应与您的子域的“ .htaccess”文件中的安全密钥相同。

  

如果文件位于子域的任何文件夹中,甚至位于不同的域中,上述逻辑也将起作用(但应该可公开访问)。