J'ai récemment eu un problème connexe et j'ai écrit cet article à ce sujet .
Je suppose que les téléchargements sont téléchargés via la gestion des médias de WordPress - ou sinon vous avez un ID de pièce jointe pour le téléchargement.
Aperçu de la solution
- Rendre le répertoire de téléchargement «sécurisé» (dans ce sens, je veux simplement dire utiliser
.htaccess
pour bloquer toute tentative d'accéder directement aux fichiers dans le répertoire de téléchargement (ou un sous-répertoire de celui-ci) - par exemple via mysite.com/wp-content/uploads/conf/2012/09/myconfidentialfile.pdf
)
- Créez un lien de téléchargement comprenant l'ID de la pièce jointe - cela passe par WordPress pour vérifier l'autorisation de l'utilisateur à afficher la pièce jointe autorise / refuse l'accès.
Avertissements
- Cela permet de
.htaccess
garantir la sécurité . Si ce n'est pas disponible / activé (serveurs nginx par exemple), vous n'obtiendrez pas beaucoup de sécurité. Vous pouvez empêcher l'utilisateur de parcourir le répertoire uplods. Mais l'accès direct fonctionnera.
- Comme ci-dessus. Cela ne doit pas être utilisé dans la distribution si vous avez besoin d'une sécurité absolue . C'est bien si votre configuration spécifique fonctionne - mais en général, cela ne peut pas être garanti. Mon article lié essaie en partie de résoudre ce problème.
- Vous perdrez des vignettes . Le blocage de l'accès direct à un dossier ou sous-dossier signifie que les vignettes des fichiers de ce dossier ne peuvent pas être affichées. Mon article lié tente en partie de résoudre ce problème.
Bloquer l'accès direct
Pour ce faire, dans votre dossier de téléchargements (ou dans un sous-dossier - tous les documents confidentiels doivent résider, à n'importe quelle profondeur, à l'intérieur de ce dossier). Placez un .htaccess
fichier avec les éléments suivants:
Order Deny,Allow
Deny from all
Dans ce qui suit, je suppose que vous joindrez des documents confidentiels au type de message «client». Tout média téléchargé sur la page de modification du client sera stocké dans le uploads/conf/
dossier
La fonction pour configurer le répertoire des téléchargements protégés
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.
}
Téléchargement de documents confidentiels
/**
* 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' );
}
}
}
Cela dit, le contenu téléchargé devrait être à l'intérieur uploads/conf
et essayer d'y accéder directement à l'aide de votre navigateur ne devrait pas fonctionner.
Téléchargement de contenu
C'est facile. L'URL de téléchargement peut être quelque chose www.site.com?wpse26342download=5
(où 5 est l'ID de pièce jointe du contenu téléchargé). Nous l'utilisons pour identifier la pièce jointe, vérifier les autorisations de l'utilisateur actuel et lui permettre de télécharger.
Tout d'abord, configurez la variable de requête
/**
* 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;
}}
Maintenant, configurez un écouteur pour (peut-être) déclencher le téléchargement ...
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;
}
Commentaires finaux
Le code ci-dessus peut contenir des bugs / erreurs de syntaxe et n'est pas testé, et vous l'utilisez à vos risques et périls :).
L'URL de téléchargement peut être «améliorée» à l'aide de réécritures. Comme indiqué dans les commentaires, vous pouvez ajouter un espace vide à l' index.php
intérieur de chaque enfant du dossier protégé pour empêcher la navigation - mais cela devrait être empêché par les .htaccess
règles de toute façon.
Une méthode plus sûre serait de stocker les fichiers publics en dehors d'un répertoire public. Ou sur un service externe comme Amazon S3. Pour ce dernier, vous devrez générer une URL valide pour récupérer le fichier sur Amazon (en utilisant votre clé privée). Ces deux éléments nécessitent un certain niveau de confiance dans votre service hôte / tiers.
Je me méfierais de l'utilisation de plug-ins suggérant qu'ils offrent des «téléchargements protégés». Je n'en ai trouvé aucun qui offre une sécurité suffisante. Veuillez également ne pas mettre en garde contre cette solution - et j'accueillerais volontiers toutes suggestions ou critiques.