web-dev-qa-db-fra.com

Protéger l'accès direct à PDF et Zip sauf si l'utilisateur est connecté (sans plugin)

Travailler sur un site d'assistance WordPress qui n'a enregistré que le contenu de l'utilisateur, y compris les fichiers PDF et Zip téléchargés.

Je cherche un moyen d'empêcher l'accès direct à ces fichiers PDF et Zip dans le répertoire wp-content/uploads sans utiliser de plug-in.

En lisant d'anciennes questions, c'est VRAIMENT fermé (mais les commentaires sont fermés): https://wordpress.stackexchange.com/a/37743/18608 car il détecte un accès direct au fichier, puis se connecte pour le sauvegarder Cliquez sur le fichier demandé et vérifiez si l'utilisateur est connecté. Sinon, il sera redirigé vers le nom d'utilisateur WordPress. S'ils sont connectés, le fichier est chargé.

C'est le htaccess original:

RewriteCond %{REQUEST_FILENAME} -s
RewriteRule ^wp-content/uploads/(.*)$ dl-file.php?file=$1 [QSA,L]

Cependant, le script bloque l'accès aux fichiers all dans le répertoire wp-content/uploads, y compris les images. Ainsi, sauf si l'utilisateur est connecté, même les images de publication de blog (qui n'ont pas besoin de protection) sont masquées. le front-end.

J'essaie de réviser RewriteRule pour vérifier les fichiers only PDF ou Zip, de sorte que le fichier dl-file.php ne soit appelé que s'il s'agit d'un PDF ou Zip étant demandé.

J'ai essayé ce qui suit, mais il retourne "404-File not found". lors de l'accès à un fichier PDF ou à un fichier Zip lorsque l'utilisateur est connecté. Ainsi, même si la vérification du type de fichier semble fonctionner, la vérification de dl-file.php échoue.

RewriteCond %{REQUEST_FILENAME} -s
RewriteRule ^wp-content/uploads/([^/]*\.(pdf|Zip))$ filecheck.php?file=$1 [QSA,L]

Comment pourrais-je réviser cela pour qu'il appelle uniquement le fichier dl-file.php s'il s'agit d'un fichier PDF ou Zip demandé, tout en transmettant les informations correctes au fichier dl-file.php?

Merci, jonathon

/*
 * 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 &#8212; 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 );
4
d38
RewriteCond %{REQUEST_FILENAME} -s
RewriteRule ^wp-content/uploads/([^/]*\.(pdf|Zip))$ filecheck.php?file=$1 [QSA,L]

Cela semble en fait correct, sauf si vous avez des sous-répertoires supplémentaires dans le répertoire /uploads? Une alternative consiste à inclure une condition supplémentaire sur la règle d'origine qui réécrit la demande uniquement si celle-ci se termine par .pdf ou .Zip. Par exemple:

RewriteCond %{REQUEST_URI} \.(pdf|Zip)$ [NC]
RewriteCond %{REQUEST_FILENAME} -s
RewriteRule ^wp-content/uploads/(.*)$ dl-file.php?file=$1 [QSA,L]

Cela ne devrait pas vraiment avoir d’importance, mais assurez-vous que cela va avant le contrôleur frontal WordPress.

3
MrWhite