it-swarm.com.de

Schutz des direkten Zugriffs auf PDF und Zip sofern Benutzer nicht eingeloggt ist (ohne Plugin)

Arbeiten an einer WordPress-Support-Site, auf der nur Benutzerinhalte registriert sind, einschließlich hochgeladener PDF- und Zip-Dateien.

Ich suche nach einer Möglichkeit, den direkten Zugriff auf diese PDF- und Zip-Dateien im Verzeichnis wp-content/uploads ohne Verwendung eines Plugins zu verhindern.

Wenn Sie ältere Fragen durchlesen, ist dies WIRKLICH nahe (aber die Kommentare sind geschlossen): https://wordpress.stackexchange.com/a/37743/18608 Wenn der direkte Zugriff auf die Datei erkannt wird, werden einige Anmeldevorgänge ausgeführt, um sie zu speichern Überprüfen Sie anhand der angeforderten Datei, ob der Benutzer angemeldet ist. Andernfalls werden sie zum WordPress-Login umgeleitet. Wenn sie angemeldet sind, wird die Datei geladen.

Dies ist der ursprüngliche htaccess:

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

Das Skript blockiert jedoch den Zugriff auf alle Dateien im Verzeichnis wp-content/uploads, einschließlich Bilder. Sofern der Benutzer nicht angemeldet ist, werden sogar Bilder von Blog-Posts (die nicht geschützt werden müssen) in ausgeblendet das Front-End.

Ich versuche, die RewriteRule so zu überarbeiten, dass nach only PDF oder Zip-Dateien gesucht wird, sodass die Datei dl-file.php nur aufgerufen wird, wenn es sich um ein PDFhandelt. _ oder Zip wird angefordert.

Ich habe Folgendes versucht, aber es wird "404-Datei nicht gefunden" zurückgegeben. Wenn der Benutzer angemeldet ist und auf ein PDF oder ein Zip zugreift, schlägt die Prüfung von dl-file.php fehl, obwohl die Prüfung des Dateityps zu funktionieren scheint.

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

Wie kann ich das so ändern, dass es nur die Datei dl-file.php aufruft, wenn eine PDF- oder Zip-Datei angefordert wird, aber trotzdem die richtigen Informationen an die Datei dl-file.php weitergibt?

Vielen Dank, 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]

Das sieht eigentlich in Ordnung aus, außer wenn Sie zusätzliche Unterverzeichnisse im Verzeichnis /uploads haben? Eine Alternative besteht darin, eine zusätzliche Bedingung in die ursprüngliche Regel aufzunehmen, die die Anforderung nur dann neu schreibt, wenn die Anforderung mit .pdf oder .Zip endet. Zum Beispiel:

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

Es sollte eigentlich egal sein, aber stellen Sie sicher, dass dies vor dem WordPress-Front-Controller geht.

3
MrWhite