web-dev-qa-db-fra.com

Comment utiliser .htaccess pour répondre avec un statut 403 interdit aux URL contenant une chaîne de requête?

Certains bots ont exploré mon site pour chaque lien qui se termine par:

?utm_source=dlvr.it&utm_medium=Twitter

Je n'ai pas vérifié son adresse IP.

Ensuite, les autres robots (10+) suivent les règles de liens ?utm_source=dlvr.it&utm_medium=Twitter et explorent également mon site. Cela entraîne une énorme quantité de trafic, ce qui provoque la fermeture de mon site. J'ai ajouté plus de 10 autres robots à ma liste noire avec un code de statut HTTP 403 lorsqu'ils accèdent à mon site.

Mais je pense que le meilleur moyen est de trouver le premier bot qui a exploré mon site pour chaque lien qui se termine par:

?utm_source=dlvr.it&utm_medium=Twitter

Ou utilisez un code d'état de redirection HTTP 403 lorsque l'URL contient:

?utm_source=dlvr.it&utm_medium=Twitter

Je connais des façons d'ajouter . Htaccess du code qui empêcherait quelqu'un d'explorer ma page xmlrpc.php, telle que:

<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>

Mais qu'en est-il d'une requête dans une URL?

5
space and time

Si vous avez le module mod_rewrite installé, vous pouvez le mettre dans votre fichier .htaccess dans le dossier racine de votre site Web (qui est généralement le dossier public_html ):

RewriteEngine On
RewriteRule ^\?utm_source\=dlvr.it\&utm_medium\=Twitter$ - [R=403,NC,L]

Vous devrez peut-être supprimer le \ du =, je ne me souviens pas si égal doit échapper.

Une autre solution serait la suivante: si vous recherchez la chaîne n’importe où dans l’URL:

RewriteEngine On
RewriteRule ^(.*)\?utm_source\=dlvr.it\&utm_medium\=Twitter(.*)$ - [R=403,NC,L]

Le NC à la fin signifie que la casse n'est pas sensible. Ainsi, si le texte est tout en majuscule, les robots seront alors dirigés vers une erreur 403.

4
Mike

? utm_source = dlvr.it & utm_medium = Twitter

utm_source et utm_medium sont utilisés par Google Analytics (et éventuellement d'autres outils de suivi) pour surveiller les campagnes. Par conséquent, bloquer l'accès uniquement sur cette chaîne de requête ne "semble pas juste", toutefois, si cela est correct dans votre cas. alors ok...

Un point important à comprendre avec chaînes de requête est qu'elles ne peuvent pas être comparées à l'aide de la variable RewriteRule de mod_rewrite (ou à l'aide de la variable Request_URI dans mod_setenvif - comme suggéré dans les commentaires). La chaîne de requête est supprimée du chemin URL before elle est comparée au modèle RewriteRule.

Activez le moteur de réécriture (mod_rewrite) si ce n'est déjà fait:

RewriteEngine On

Vous devez utiliser la directive RewriteCond. Donc, afin de servir un "403 Interdit" pour toutes les demandes qui correspondent à la chaîne de requête ci-dessus, vous pouvez utiliser quelque chose comme:

RewriteCond %{QUERY_STRING} =utm_source=dlvr.it&utm_medium=Twitter
RewriteRule .* - [F]

Ceci est une correspondance exacte pour la chaîne de requête spécifiée (ce n'est pas une regex, le point n'a donc pas besoin d'être échappé). L’indicateur L n’est pas requis pour spécifier l’indicateur F (c’est implicite). (F est un raccourci pour R=403.)

Si vous avez besoin que cela soit moins restrictif et que toutes les chaînes de requête commençant par la chaîne de requête ci-dessus correspondent, utilisez une expression régulière:

RewriteCond %{QUERY_STRING} ^utm_source=dlvr\.it&utm_medium=Twitter
RewriteRule .* - [F]

Vous pouvez également rendre la regex insensible à la casse en utilisant l'indicateur NC (NOCASE). Cependant, ne l'utilisez que si vous voulez spécifiquement ignorer la casse dans la correspondance. Les gens ont tendance à ajouter ce drapeau par habitude. Cependant, il est souvent inutile (voire même incorrect) et rend le travail du moteur des expressions rationnelles encore plus difficile.

Ce n'est pas particulièrement efficace puisque chaque demande sera traitée. Si, par exemple, seules les URL situées dans le chemin /path/to/files sont ciblées, vous pouvez rendre le modèle RewriteRule plus restrictif:

RewriteRule ^path/to/files/ - [F]
3
MrWhite