Ich benutze WordPress für eine private Site, auf der Benutzer Dateien hochladen. Ich verwende "Private WordPress", um den Zugriff auf die Site zu verhindern, wenn der Benutzer nicht angemeldet ist.
Ich möchte dasselbe mit den Dateien machen, die im Upload-Ordner hochgeladen wurden.
Wenn ein Benutzer nicht angemeldet ist, kann er nicht auf Folgendes zugreifen: https://xxxxxxx.com/wp-content/uploads/2011/12/xxxxxxx.pdf , wenn er versucht, darauf zuzugreifen, dies jedoch nicht der Fall ist angemeldet, dann sollten sie zum Beispiel auf die Anmeldeseite umgeleitet werden.
Ich habe ein Plugin namens private files gefunden, aber das letzte Update war 2009 und es scheint nicht auf meinem WordPress zu funktionieren.
Kennt jemand eine Methode? Hotlinking-Methode wird ausreichen, um dies zu schützen?
Ich habe auch diese Methode gefunden:
# 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
Aber dann könnte jeder Benutzer, der das Cookie repliziert, dieses Recht bestehen? Grüße
Nur zu prüfen, ob der Cookie existiert, ist kein strenger Schutz.
Um einen stärkeren Schutz zu erhalten, können Sie alle Anforderungen an den hochgeladenen Ordner (im folgenden Beispiel uploads
) über ein PHP-Skript übergeben oder "vertreten":
RewriteCond %{REQUEST_FILENAME} -s
RewriteRule ^wp-content/uploads/(.*)$ dl-file.php?file=$1 [QSA,L]
Alle Anfragen an hochgeladene Dateien (die Bilder in Beiträgen enthalten) würden an dl-file.php
gehen, der dann überprüfen kann, ob der Benutzer angemeldet ist oder nicht.
Wenn der Benutzer nicht angemeldet ist, wird das Anmeldeformular Ihrer Site angezeigt. Nachdem sich der Benutzer angemeldet hat, wird er zurück in die Datei geleitet und kann diese jetzt herunterladen.
Ähnliches finden Sie in \wp-includes\ms-files.php
in Ihrer WordPress-Installation, aber dieses ist für Multisite und ohne Login-Prüfung und Weiterleitungen.
Je nachdem, wie viel Verkehr Sie haben, ist es möglicherweise sinnvoll, diesen besser in Ihren Server zu integrieren, z. X-Accel-Redirect
oder X-Sendfile
Header.
Sie können ein Plugin auch mithilfe des Hooks init
und des Befehls get-value $_GET[ 'file' ];
schreiben. Wenn der Benutzer diesen get-Wert hat, springen Sie in eine Funktion, um die Zugriffsrechte für die Dateien zu überprüfen: Zum Beispiel mit einem Kontrollkästchen in einer Meta-Box.
add_action( 'init', 'fb_init' );
function fb_init() {
// this in a function for init-hook
if ( '' != $_GET[ 'file' ] ) {
fb_get_file( $_GET[ 'file' ] );
}
}
die Funktion get_file ()
function fb_get_file( $file ) {
$upload = wp_upload_dir();
$the_file = $file;
$file = $upload[ 'basedir' ] . '/' . $file;
if ( !is_file( $file ) ) {
status_header( 404 );
die( '404 — File not found.' );
}
else {
$image = get_posts( array( 'post_type' => 'attachment', 'meta_query' => array( array( 'key' => '_wp_attached_file', 'value' => $the_file ) ) ) );
if ( 0 < count( $image ) && 0 < $image[0] -> post_parent ) { // attachment found and parent available
if ( post_password_required( $image[0] -> post_parent ) ) { // password for the post is not available
wp_die( get_the_password_form() );// show the password form
}
$status = get_post_meta( $image[0] -> post_parent, '_inpsyde_protect_content', true );
if ( 1 == $status && !is_user_logged_in() ) {
wp_redirect( wp_login_url( $upload[ 'baseurl' ] . '/' . $the_file ) );
die();
}
}
else {
// not a normal attachment check for thumbnail
$filename = pathinfo( $the_file );
$images = get_posts( array( 'post_type' => 'attachment', 'meta_query' => array( array( 'key' => '_wp_attachment_metadata', 'compare' => 'LIKE', 'value' => $filename[ 'filename' ] . '.' . $filename[ 'extension' ] ) ) ) );
if ( 0 < count( $images ) ) {
foreach ( $images as $SINGLEimage ) {
$meta = wp_get_attachment_metadata( $SINGLEimage -> ID );
if ( 0 < count( $meta[ 'sizes' ] ) ) {
$filepath = pathinfo( $meta[ 'file' ] );
if ( $filepath[ 'dirname' ] == $filename[ 'dirname' ] ) {// current path of the thumbnail
foreach ( $meta[ 'sizes' ] as $SINGLEsize ) {
if ( $filename[ 'filename' ] . '.' . $filename[ 'extension' ] == $SINGLEsize[ 'file' ] ) {
if ( post_password_required( $SINGLEimage -> post_parent ) ) { // password for the post is not available
wp_die( get_the_password_form() );// show the password form
}
die('dD');
$status = get_post_meta( $SINGLEimage -> post_parent, '_inpsyde_protect_content', true );
if ( 1 == $status && !is_user_logged_in() ) {
wp_redirect( wp_login_url( $upload[ 'baseurl' ] . '/' . $the_file ) );
die();
}
}
}
}
}
}
}
}
}
$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 );
die();
}
Sie können auch eine benutzerdefinierte URL für Dateien über den Hook hinzufügen. generate_rewrite_rules
add_filter( 'generate_rewrite_rules', 'fb_generate_rewrite_rules' );
function fb_generate_rewrite_rules( $wprewrite ) {
$upload = wp_upload_dir();
$path = str_replace( site_url( '/' ), '', $upload[ 'baseurl' ] );
$wprewrite -> non_wp_rules = array( $path . '/(.*)' => 'index.php?file=$1' );
return $wprewrite;
}
Wenn Sie einen Plug-in-basierten Ansatz zur Lösung dieses Problems wünschen, finden Sie hier eine einigermaßen gute Lösung, die ich (endlich) gefunden habe:
/wp-content/uploads/dlm_uploads/
gespeichert wird.Dies bedeutet, dass jeder, der nicht angemeldet ist, die Datei weder herunterladen noch die tatsächliche URL der Datei anzeigen kann. Falls jemand die URL zu der Datei herausfindet, der nicht autorisiert ist, stoppt das Plugin auch das Surfen der Benutzer zur URL der realen Datei, indem der Zugriff auf den Ordner /wp-content/uploads/dlm_uploads/
gesperrt wird.
Bonus: Wenn Sie dies für eine Site tun, auf der sich Benutzer nur als "Mitglieder" anmelden dürfen (aber keine WordPress-Berechtigungen wie Seitenbearbeitung oder Administratorrechte besitzen), installieren Sie das Plugin "Mitglieder" https: //wordpress.org/plugins/members/ , erstellen Sie eine neue Benutzerrolle mit dem Namen "Mitglied" und geben Sie ihr die einzige Lesefunktion, erstellen Sie einen neuen Benutzer in WordPress und stellen Sie sicher, dass Sie ihnen eine Rolle zuweisen von 'Mitglied'.
Wenn Sie den Inhalt von Seiten schützen möchten, bietet das Plugin "Mitglieder" einige Optionen oder es gibt andere Plugins. Wenn Sie möchten, dass die Anmeldeseite für Mitglieder besser aussieht als das WordPress-Standard-Anmeldeformular, verwenden Sie etwas wie "Mein Login gestalten": https://wordpress.org/plugins/theme-my-login/