web-dev-qa-db-fra.com

htaccess 410 requêtes de piratage de spam dans l'url excluant la requête générée par le site

Notre site a été piraté et des liens vers du contenu aléatoire ont été ajoutés au site. Nous avons complètement supprimé le site piraté et en avons mis un nouveau à la place. Tout ce qui est nouveau, y compris les images et le contenu, aucune autre partie de l'ancien site n'a été utilisée.

Le problème que nous avons maintenant est que le pirate informatique a soumis des centaines de milliers de liens vers les robots de recherche et que le serveur est visité en permanence toutes les secondes par les robots qui essaient d'indexer les liens qui n'existent pas et qui n'ont jamais existé auparavant. le nouveau site.

Nous avons essayé de lutter contre cela en utilisant le fichier htaccess du site avec plusieurs instances de différentes conditions et règles de réécriture qui indiquent aux bots que le contenu a disparu.

Exemple

RewriteCond %{REQUEST_URI} .*/product/.*
RewriteRule ^ - [R=410,L]

Le problème, c’est que certaines requêtes parviennent à l’écran et produisent des erreurs 301 et 404.

Cela oblige les robots à tester à nouveau la demande et à signaler que notre site contient 100 000 liens incorrects.

Je recherche une solution qui renvoie 410 codes aux robots pour toutes les demandes, à l'exclusion de toutes les demandes de source faisant partie de notre site.

Le site ne compte qu'environ 10 pages, mais il s’agit d’un CMS Joomla, de sorte qu’une masse de ressources est chargée en arrière-plan pour fournir la page.

Mon idée était de visiter chaque page du site et d'utiliser l'inspection des navigateurs pour rassembler une liste de toutes les demandes de ressources effectuées par une page.

La question est de savoir comment puis-je formuler cela dans des conditions et des règles pour htaccess afin que toutes les demandes de page, y compris route/soient livrées, mais que les liens de hackers demandés par le bot ne le soient pas?

Nous travaillons également sur l'envoi d'e-mails aux bots pour leur dire que leurs requêtes sont en train d'être instiguées par le pirate informatique.

2
744

Vous voulez essentiellement envoyer un 410 au lieu d'un 404.

La méthode la plus simple (si vous connaissez bien Joomla) consiste à remplacer le fichier error.php dans votre modèle et à définir manuellement le statut 410 lorsque le type 404 a déjà été déterminé. Par exemple, en haut de votre fichier error.php, quelque chose comme ceci:

if ($this->error->getCode() == '404'){
    header("HTTP/1.0 410 Gone");
}

Comme vous ne disposez que d'environ 10 pages, vous pouvez le faire dans .htaccess en créant une liste blanche de vos URL de page et en activant un 410 si l'URL demandée ne correspond pas à votre liste blanche et n'existe pas en tant que un fichier physique. Cela évite également que la requête soit ralentie par Joomla (pour et contre - voir fin).

Par exemple:

# Whitelist of page URLs 
# NB: Last condition must not have an OR flag
RewriteCond %{REQUEST_URI} =/second-page [OR]
RewriteCond %{REQUEST_URI} =/third-page [OR]
RewriteCond %{REQUEST_URI} =/fourth-page [OR]
RewriteCond %{REQUEST_URI} =/fifth-page [OR]
RewriteCond %{REQUEST_URI} ^/admin/
RewriteRule . - [E=PAGE_URL:yes]

# Send 410 Gone
RewriteCond %{REQUEST_URI} !\.(css|js|png|jpg|gif|svg|pdf)$ [NC]
RewriteCond %{ENV:PAGE_URL} !yes
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !^(index\.php)?$ - [G]

Cela suppose que la page d'accueil (c'est-à-dire /) est une URL de page valide. L'indicateur G (gone) est un raccourci pour R=410 et l'indicateur L n'est pas obligatoire (c'est implicite).

La première directive RewriteCond exclut que les URL ressemblant à des ressources statiques (désignées par l'extension de fichier) soient traitées par un 410 lorsqu'elles n'existent pas. Elles doivent obtenir la valeur par défaut 404. Cela suppose que les URL de spam ne sont pas destinées à ces types des ressources statiques. Par exemple, si vous recevez des demandes de type spam de fichiers non-sens .css, supprimez cette extension de la directive RewriteCond ou supprimez entièrement la condition de servir un 410 pour toutes ces ressources manquantes.

Le préfixe = sur le CondPattern , par exemple. =/second-page, en fait une comparaison de chaîne de correspondance exacte, pas une expression régulière, pas besoin d'échapper à des méta-caractères regex etc.

Toutefois, votre "page Joomla 404" conviviale de Nice sera perdue et vous devrez peut-être en créer une.


PDATE:

Certaines des URL de spam ont ce type de structure /?anything=

Si vous souhaitez bloquer une URL contenant une chaîne de requête, vous avez besoin d'une condition qui vérifie la variable de serveur QUERY_STRING. Essayez d'ajouter ce qui suit:

# Block any URL that contains a query string on unknown pages
RewriteCond %{QUERY_STRING} .
RewriteCond %{ENV:PAGE_URL} !yes
RewriteRule ^ - [G]

La regex à un point (qui correspond à un seul caractère) vérifie simplement qu’une chaîne de requête est présente.

2
MrWhite