Ich habe kürzlich ein ähnliches Problem gehabt und diesen Artikel darüber geschrieben .
Ich gehe davon aus, dass die Downloads über das Media Handling von WordPress hochgeladen werden - oder Sie haben eine Anhang-ID für den Download.
Umriss der Lösung
- Das Upload-Verzeichnis 'sicher' machen (in diesem Sinne meine ich damit nur den
.htaccess
Versuch, den direkten Zugriff auf Dateien im Upload-Verzeichnis (oder einem Unterverzeichnis davon) zu blockieren - z. B. über mysite.com/wp-content/uploads/conf/2012/09/myconfidentialfile.pdf
)
- Erstellen Sie einen Download-Link mit der ID des Anhangs. Hiermit überprüfen Sie in WordPress, ob der Benutzer zum Anzeigen des Anhangs berechtigt ist, und verweigern den Zugriff.
Vorbehalte
- Dies dient der
.htaccess
Sicherheit . Wenn dies nicht verfügbar / aktiviert ist (z. B. Nginx-Server), erhalten Sie nicht viel Sicherheit. Sie können verhindern, dass der Benutzer das Verzeichnis uplods durchsucht . Aber der direkte Zugriff wird funktionieren.
- Wie oben Dies sollte nicht in der Distribution verwendet werden, wenn Sie absolute Sicherheit benötigen . Es ist in Ordnung, wenn Ihr spezielles Setup funktioniert - aber im Allgemeinen kann dies nicht garantiert werden. Mein verlinkter Artikel versucht zum Teil, dies zu beheben.
- Sie werden Thumbnails verlieren . Wenn Sie den direkten Zugriff auf einen Ordner oder Unterordner blockieren, können Miniaturansichten der Dateien in diesem Ordner nicht angezeigt werden. Mein verlinkter Artikel versucht teilweise, dies zu beheben.
Direktzugriff sperren
Zu diesem Zweck muss sich das gesamte vertrauliche Material in Ihrem Upload-Ordner (oder einem Unterordner) in einer beliebigen Tiefe in diesem Ordner befinden. Legen Sie eine .htaccess
Datei mit den folgenden Eigenschaften ab:
Order Deny,Allow
Deny from all
Im Folgenden gehe ich davon aus, dass Sie vertrauliches Material an den Beitragstyp "Client" anhängen. Alle auf der Client-Bearbeitungsseite hochgeladenen Medien werden im uploads/conf/
Ordner gespeichert
Die Funktion zum Einrichten des geschützten Upload-Verzeichnisses
function wpse26342_setup_uploads_dir(){
$wp_upload_dir = wp_upload_dir();
$protected_folder = trailingslashit($wp_upload_dir['basedir']) . 'conf';
// Do not allow direct access to files in protected folder
// Add rules to /uploads/conf/.htacess
$rules = "Order Deny,Allow\n";
$rules .= "Deny from all";
if( ! @file_get_contents( trailingslashit($protected_folder).'.htaccess' ) ) {
//Protected directory doesn't exist - create it.
wp_mkdir_p( $protected_folder);
}
@file_put_contents( trailingslashit($protected_folder).'.htaccess', $rules );
//Optional add blank index.php file to each sub-folder of protected folder.
}
Hochladen von vertraulichem Material
/**
* Checks if content is being uploaded on the client edit-page
* Calls a function to ensure the protected file has the .htaccess rules
* Filters the upload destination to the protected file
*/
add_action('admin_init', 'wpse26342_maybe_change_uploads_dir', 999);
function wpse26342_maybe_change_uploads_dir() {
global $pagenow;
if ( ! empty( $_POST['post_id'] ) && ( 'async-upload.php' == $pagenow || 'media-upload.php' == $pagenow ) ) {
if ( 'client' == get_post_type( $_REQUEST['post_id'] ) ) {
//Uploading content on the edit-client page
//Make sure uploads directory is protected
wpse26342_setup_uploads_dir();
//Change the destination of the uploaded file to protected directory.
add_filter( 'upload_dir', 'wpse26342_set_uploads_dir' );
}
}
}
Danach sollte sich der hochgeladene Inhalt in uploads/conf
Ihrem Browser befinden und der Versuch, mit Ihrem Browser direkt darauf zuzugreifen, sollte nicht funktionieren.
Herunterladen von Inhalten
Das ist einfach. Die Download-URL kann etwas sein www.site.com?wpse26342download=5
(wobei 5 die Anhang-ID des hochgeladenen Inhalts ist). Wir verwenden dies, um den Anhang zu identifizieren, die Berechtigungen des aktuellen Benutzers zu überprüfen und ihnen das Herunterladen zu ermöglichen.
Richten Sie zunächst die Abfragevariable ein
/**
* Adds wpse26342download to the public query variables
* This is used for the public download url
*/
add_action('query_vars','wpse26342_add_download_qv');
function wpse26342_add_download_qv( $qv ){
$qv[] = 'wpse26342download';
return $qv;
}}
Richten Sie nun einen Listener ein, um (vielleicht) den Download auszulösen ...
add_action('request','wpse26342_trigger_download');
function wpse26342_trigger_download( $query_vars ){
//Only continue if the query variable set and user is logged in...
if( !empty($query_vars['wpse26342download']) && is_user_logged_in() ){
//Get attachment download path
$attachment = (int) $query_vars['wpse26342download'];
$file = get_attached_file($attachment);
if( !$file )
return;
//Check if user has permission to download. If not abort.
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit();
}
return $query_vars;
}
Letzte Kommentare
Der obige Code kann Fehler / Syntaxfehler enthalten und ist ungetestet. Die Verwendung erfolgt auf eigenes Risiko :).
Die Download-URL kann durch Umschreiben "verschönert" werden. Wie in den Kommentaren angegeben, können Sie index.php
in jedes untergeordnete Element des geschützten Ordners ein Leerzeichen einfügen, um das Durchsuchen zu verhindern. Dies sollte jedoch durch die .htaccess
Regeln verhindert werden.
Eine sicherere Methode wäre, die öffentlichen Dateien außerhalb eines öffentlichen Verzeichnisses zu speichern. Oder über einen externen Dienst wie Amazon S3. Für letzteres müssen Sie eine gültige URL generieren, um die Datei von Amazon abzurufen (mit Ihrem privaten Schlüssel). Beides setzt ein gewisses Maß an Vertrauen in Ihren Host / Third Party Service voraus.
Ich wäre vorsichtig bei der Verwendung von Plug-Ins, die "geschützte Downloads" anbieten. Ich habe keine gefunden, die ausreichend Sicherheit bieten. Bitte beachten Sie auch die Einschränkungen dieser Lösung - und ich würde Anregungen und Kritik begrüßen.