web-dev-qa-db-fra.com

Vérifiez 2 cookies avec mod_rewrite avant de servir des images

J'ai la règle mod_rewrite suivante, qui fonctionne très bien sur mon ordinateur Apache 2.x sur CentOS 6 Linux, mais elle n'est pas complète:

RewriteCond %{HTTP_COOKIE} !id
RewriteCond %{REQUEST_URI} ^/sites/default/files/pictures/picture-
RewriteRule .* /images/dummy.png [L]

parce que j'essaie de le changer de 2 manières:

  1. En fait, 2 cookies (et pas seulement 1 comme ci-dessus) devraient être présents: id et auth (mais je ne sais pas comment faire (X ou Y) et Z avec mod_rewrite)

  2. Je voudrais vérifier que la valeur du auth cookie est une chaîne de 32 caractères hexadécimaux (un hachage MD5) et que la valeur de id Le cookie est numérique.

En réalité, j'ai reçu une facture de 1 000 EUR de Getty Images, car l'un des Drupal utilisateurs de mon serveur a soi-disant utilisé leur photo comme avatar. Je ne cherche ici aucun conseil d'avocat ou de pseudo-avocat, mais juste un moyen d'afficher une image factice au lieu de véritables images d'utilisateurs pour les robots d'exploration de sites Web.

Et oui, j'ai remarqué dans la doc mod_rewrite , que je pouvais transmettre les valeurs de cookie à un script externe via mod_rewrite (pour vérifier le hachage MD5), mais j'aimerais aborder cette question plus tard.

UPDATE 2:

Je suis venu avec ce qui suit

RewriteCond %{REQUEST_URI} ^/sites/default/files/pictures/picture-
RewriteCond %{HTTP_COOKIE} !auth=[a-fA-F0-9]{32} [OR]
RewriteCond %{HTTP_COOKIE} !id=[0-9]+
RewriteRule .* /images/dummy.png [L]

mais je ne suis pas sûr si les RewriteCond ci-dessus agissent comme X et (Y ou Z) ou (X et Y) ou Z

1
Alexander Farber

Que dis-tu de ça:

RewriteEngine On
RewriteCond %{HTTP_COOKIE} !(^|;\s*)id=[0-9]+(;\s*)auth=[0-9a-fA-F]{32}(;\s*)
RewriteCond %{REQUEST_URI} ^/sites/default/files/pictures/picture-
RewriteRule .* /images/dummy.png [L]
1
quanta

mais je ne suis pas sûr si les actions précédentes de RewriteCond agissent comme X et (Y ou Z) ou (X et Y) ou Z

Dans les directives que vous avez postées, il s’agit de l’ancienne: X et (Y ou Z)

Cependant, comme mentionné dans mon commentaire ci-dessus, il est plus efficace de vérifier le chemin d'URL dans le modèle RewriteRule - puisqu'il s'agit de ce qui est traité en premier Cela évite que la RewriteRule ne soit traitée pour chaque requête (comme ce qui se produit lors de l'utilisation d'un modèle fourre-tout comme .*). Vous n'avez alors plus que deux conditions ORd permettant de vérifier l'absence de l'un ou l'autre des cookies (dans n'importe quel ordre). Par exemple:

RewriteEngine On
RewriteCond %{HTTP_COOKIE} !(^|;\s*)id=[0-9]+ [OR]
RewriteCond %{HTTP_COOKIE} !(^|;\s*)auth=[0-9a-fA-F]{32}
RewriteRule ^/sites/default/files/pictures/picture- /images/dummy.png [L]

Le préfixe de modèle (^|;\s*) précédant le nom du cookie a pour seul objectif de vous protéger contre la situation où vous avez d'autres cookies portant un nom similaire (mais plus long). par exemple. uid ou userauth, etc. Si ce n'est pas possible, ce sous-motif peut être omis.

Il n'est pas nécessaire de rechercher (;\s*) à la fin de la valeur du cookie, comme dans la réponse de @ quanta, car cela ne fait pas partie de la valeur que vous essayez de valider. Et l'en-tête Cookie: ne devrait pas se terminer de toute façon par un ; - il est donc possible que cela ne corresponde pas.

2
MrWhite