web-dev-qa-db-fra.com

Protéger les téléchargements sur plusieurs sites

J'utilise WordPress multisite (3.3.1) et j'essaie de protéger les téléchargements de certains blogs contre les hyperliens et l'accès direct. Ceci est vaguement lié à Comment protéger les téléchargements, si l'utilisateur n'est pas connecté? , mais je veux seulement que les téléchargements soient accessibles via des scripts exécutés sur le serveur (c’est-à-dire que le serveur seul peut afficher/servir les téléchargements), afin que le contenu puisse être protégé par les droits de l’utilisateur WordPress.

Par exemple, j'ai un fichier appelé 40c.jpg situé à l'emplacement localhost/files/2011/07/40c.jpg ; Je veux que le fichier apparaisse seulement lorsqu'il est appelé par HTML sur le domaine local (ici: localhost ). Donc pas sur n’importe quel autre site du réseau WordPress, de tout autre domaine ou directement accessible (IE. Visit localhost/files/2011/07/40c.jpg ).

Pour ce faire, utilisez de préférence WP_Rewrite dans le fichier functions.php du thème de ce site. car cela limiterait facilement l’impact à ce site. Mais utiliser le .htaccess dans WordPress root est également une option viable, bien que je suppose que cela voudrait dire que le domaine lui-même devrait être spécifié ici (IE. localhost ).

Des suggestions sur la façon d'accomplir ceci? J'ai eu très peu de chance en recherchant StackExchange, WordPress.org et Google.

1
OleVik

Vous avez des problèmes dans votre objectif sous-jacent ...

Par exemple, j'ai un fichier nommé 40c.jpg situé à localhost/files/2011/07/40c.jpg

OK, c'est logique et c'est là que l'image devrait être en premier lieu.

Je veux que le fichier ne s'affiche que lorsqu'il est appelé par HTML sur le domaine local (ici: localhost). Donc, pas sur un autre site du réseau WordPress, dans un autre domaine ou directement accessible (par exemple, visitez le site localhost/files/2011/07/40c.jpg).

C'est là que tu as un problème ...

Lorsque vous référencez une image dans un bloc HTML, le code HTML n’appelle/ne sert pas l’image. Votre serveur donne le code HTML au navigateur, le navigateur le analyse et voit la référence de l'image, puis le navigateur se retire et demande à votre serveur l'image.

Par exemple, voici l'activité réelle du réseau pour les images sur mon propre site: Example Screenshot

Pour cette grande image de code dans l'en-tête, mon serveur renvoie ce balisage:

<img width="600" height="300" src="http://mindsharestrategy.com/files/2010/12/code.png" class="attachment-Slideshow" alt="code" title="code">

Mon navigateur le voit et effectue une requête séparée pour l'image, télécharge l'image du serveur et la restitue à l'écran.

Si je voulais limiter le nombre de personnes pouvant charger cette image, j'ajouterais sur le serveur du code permettant d'intercepter la demande, vérifiez la valeur de l'en-tête Referer, et retourner le contenu ou non.

Cette manipulation est 100% en dehors de WordPress. Non WP_Rewrite. Pas de plugins. Rien à faire avec votre thème. Vous pourriez pouvoir demander à Apache de le faire avec une combinaison de modifications apportées à .htaccess et à httpd.conf, mais c'est une tâche de système d'administration qui dépasse le cadre de ce site.

1
EAMann

Il existe plusieurs façons de gérer cela efficacement, la plupart nécessitant l’utilisation d’un plugin ou d’un comportement analogue à un plugin (voir Ajout de règles mod_rewrite à htaccess et WP_Rewrite dans le Codex ). Le problème réside vraiment dans la manière dont WordPress gère les téléchargements dans un environnement multisite et dans la manière d’appliquer une règle RewriteRule qui affecte uniquement un site spécifique .

Un utilisateur utile sur les forums de WordPress.org a suggéré d’ajouter ce qui suit ( juste en dessous "# fichiers téléchargés" dans le fichier .htaccess à la racine de WordPress):

RewriteCond %{HTTP_Host} ^somedomain\.com
RewriteCond %{SCRIPT_FILENAME} ^([_0-9a-zA-Z-]+/)?files/(.+)
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) - [L]

somedomain serait le domaine dans lequel l'accès direct aux fichiers ne serait pas autorisé. Ajoutez aussi Options All -Indexes et ceci:

# ultimate hotlink protection
<IfModule mod_rewrite.c>
 RewriteEngine on
 RewriteCond %{HTTP_REFERER}     !^$
 RewriteCond %{REQUEST_FILENAME} -f
 RewriteCond %{REQUEST_FILENAME} \.(gif|jpe?g?|png)$           [NC]
 RewriteCond %{HTTP_REFERER}     !^https?://([^.]+\.)?domain\. [NC]
 RewriteRule \.(gif|jpe?g?|png)$                             - [F,NC,L]
</ifModule>

empêche la liste des répertoires et les liens hypertextes (à partir de Presse périssable ), respectivement.

Espérons que cela sera plus facile à gérer dans les futures versions de WordPress (voir Ticket # 19235: Désactivez ms-files.php par défaut ).

0
OleVik