security - Bloquer l'accès des utilisateurs aux éléments internes d'un site à l'aide de HTTP_REFERER

Translate

J'ai le contrôle sur HttpServer mais pas sur ApplicationServer ou les applications Java qui s'y trouvent, mais je dois bloquer l'accès direct à certaines pages de ces applications. Précisément, je ne veux pas que les utilisateurs automatisent l'accès aux formulaires émettant des requêtes HTTP GET / POST directes vers le servlet approprié.

J'ai donc décidé de bloquer les utilisateurs en fonction de la valeur deHTTP_REFERER. Après tout, si l'utilisateur navigue à l'intérieur du site, il disposera d'unHTTP_REFERER. Eh bien, c'est ce que je pensais.

J'ai implémenté une règle de réécriture dans le fichier .htaccess qui dit:

RewriteEngine on 

# Options +FollowSymlinks
RewriteCond %{HTTP_REFERER} !^http://mywebaddress(.cl)?/.* [NC]
RewriteRule (servlet1|servlet2)/.+\?.+ - [F]

Je m'attendais à interdire l'accès aux utilisateurs qui ne naviguaient pas sur le site mais émettraient des requêtes GET directes aux servlets "servlet1" ou "servlet2" en utilisant des chaînes de requêtes. Mais mes attentes ont pris fin brusquement car l'expression régulière(servlet1|servlet2)/.+\?.+n'a pas fonctionné du tout.

J'ai été vraiment déçu quand j'ai changé cette expression en(servlet1|servlet2)/.+et cela a si bien fonctionné que mes utilisateurs ont été bloqués, qu'ils aient navigué sur le site ou non.

Donc, ma question est: Comment puis-je accomplir cette chose de ne pas autoriser les "robots" avec un accès direct à certaines pages si je n'ai pas d'accès / privilèges / temps pour modifier l'application?

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

Je ne sais pas si je peux résoudre cela en une seule fois, mais nous pouvons faire des allers-retours si nécessaire.

Tout d'abord, je veux répéter ce que je pense que vous dites et m'assurer que je suis clair. Vous voulez interdire les demandes à servlet1 et servlet2 si la demande n'a pas le référent approprié etEst-ce queavez une chaîne de requête? Je ne suis pas sûr de comprendre (servlet1 | servlet2) /.+\?.+ car il semble que vous ayez besoin d'un fichier sous servlet1 et 2. Je pense que vous combinez peut-être PATH_INFO (avant le "?") Avec un GET chaîne de requête (après le "?"). Il semble que la partie PATH_INFO fonctionnera, mais pas le test de requête GET. J'ai fait un test rapide sur mon serveur en utilisant script1.cgi et script2.cgi et les règles suivantes ont fonctionné pour accomplir ce que vous demandez. Ils sont évidemment un peu édités pour correspondre à mon environnement:

RewriteCond %{HTTP_REFERER} !^http://(www.)?example.(com|org) [NC]
RewriteCond %{QUERY_STRING} ^.+$
RewriteRule ^(script1|script2)\.cgi - [F]

Ce qui précède a détecté toutes les demandes de références erronées à script1.cgi et script2.cgi qui ont tenté de soumettre des données à l'aide d'une chaîne de requête. Cependant, vous pouvez également soumettre des données en utilisant un path_info et en publiant des données. J'ai utilisé ce formulaire pour me protéger contre l'une des trois méthodes utilisées avec un référent incorrect:

RewriteCond %{HTTP_REFERER} !^http://(www.)?example.(com|org) [NC]
RewriteCond %{QUERY_STRING} ^.+$ [OR]
RewriteCond %{REQUEST_METHOD} ^POST$ [OR]
RewriteCond %{PATH_INFO} ^.+$
RewriteRule ^(script1|script2)\.cgi - [F]

Sur la base de l'exemple que vous essayez de faire fonctionner, je pense que c'est ce que vous voulez:

RewriteCond %{HTTP_REFERER} !^http://mywebaddress(.cl)?/.* [NC]
RewriteCond %{QUERY_STRING} ^.+$ [OR]
RewriteCond %{REQUEST_METHOD} ^POST$ [OR]
RewriteCond %{PATH_INFO} ^.+$
RewriteRule (servlet1|servlet2)\b - [F]

Espérons que cela vous rapproche au moins de votre objectif. S'il vous plaît laissez-nous savoir comment cela fonctionne, je suis intéressé par votre problème.

(BTW, je suis d'accord que le blocage des référents est une mauvaise sécurité, mais je comprends aussi que la relation force parfois des solutions imparfaites et partielles, ce que vous semblez déjà reconnaître.)

La source
Translate

Je n'ai pas de solution, mais je parie que compter sur le référent ne fonctionnera jamais parce que les agents utilisateurs sont libres de ne pas l'envoyer du tout ou de l'usurper à quelque chose qui les laissera entrer.

La source
Translate

Vous ne pouvez pas distinguer les utilisateurs et les scripts malveillants par leur requête http. Mais vous pouvez analyser les utilisateurs qui demandent trop de pages en trop peu de temps et bloquer leurs adresses IP.

La source
Translate

L'utilisation d'un référent est très peu fiable comme méthode de vérification. Comme d'autres personnes l'ont mentionné, il est facilement usurpé. Votre meilleure solution est de modifier l'application (si vous le pouvez)

Vous pouvez utiliser un CAPTCHA, ou définir une sorte de cookie ou de cookie de session qui garde la trace de la dernière page visitée par l'utilisateur (une session serait plus difficile à usurper) et garder une trace de l'historique de consultation de la page, et autoriser uniquement les utilisateurs qui ont parcouru le pages nécessaires pour accéder à la page que vous souhaitez bloquer.

Cela nécessite évidemment que vous ayez accès à l'application en question, mais c'est le moyen le plus infaillible (pas complètement, mais "assez bon" à mon avis).

La source
Translate

Javascript est un autre outil utile pour empêcher (ou au moins retarder) le grattage d'écran. La plupart des outils de scraping automatisés n'ont pas d'interpréteur Javascript, vous pouvez donc faire des choses comme définir des champs cachés, etc.

Edit: quelque chose du genrecet article de Phil Haack.

La source
Kev
Translate

Je suppose que vous essayez d'empêcher le grattage d'écran?

À mon avis honnête, c'est difficile à résoudre et essayer de corriger en vérifiant la valeur de HTTP_REFERER n'est qu'un plâtre collant. Quiconque prend la peine d'automatiser les soumissions sera suffisamment avisé pour envoyer le bon référent à partir de son «automate».

Vous pouvez essayer de limiter le taux, mais sans modifier réellement l'application pour forcer une sorte de validation is-this-a-human (un CAPTCHA) à un moment donné, vous aurez du mal à éviter.

La source
Translate

Si vous essayez d'empêcher les robots des moteurs de recherche d'accéder à certaines pages, assurez-vous d'utiliser un format correctementrobots.txtfichier.

L'utilisation de HTTP_REFERER n'est pas fiable car elle estfacilement truqué.

Une autre option consiste à vérifier la chaîne de l'agent utilisateur pour les bots connus (cela peut nécessiter une modification du code).

La source
Translate

Pour rendre les choses un peu plus claires:

  1. Oui, je sais que l'utilisation de HTTP_REFERER est complètement peu fiable et quelque peu enfantine, mais je suis à peu près sûre que les personnes qui ont appris (de moi peut-être?) À faire des automatisations avec Excel VBA ne sauront pas comment subvertir un HTTP_REFERER dans le laps de temps pour avoir la solution finale.

  2. Je n'ai pas accès / privilège pour modifier le code de l'application. Politique. Croyez-vous cela? Je dois donc attendre que le titulaire des droits apporte les modifications que j'ai demandées.

  3. D'après les expériences précédentes, je sais que les changements demandés prendront deux mois pour entrer en production. Non, leur jeter des livres de méthodologies agiles dans leur tête n'a rien amélioré.

  4. Ceci est une application intranet. Donc je n'ai pas beaucoup de jeunes qui essaient de saper mon prestige. Mais je suis assez jeune pour tenter de saper le prestige d'un «service de conseil global très sophistiqué qui vient d'Inde» mais où, curieusement, il n'y a pas un seul Indien qui y travaille.

Jusqu'à présent, la meilleure réponse vient de "Michel de Mare": bloquer les utilisateurs en fonction de leur adresse IP. Eh bien, c'est ce que j'ai fait hier. Aujourd'hui, je voulais faire quelque chose de plus générique car j'ai beaucoup d'utilisateurs de kangourous (sautant d'une adresse IP à une autre) car ils utilisent VPN ou DHCP.

La source
Translate

Vous pourrez peut-être utiliser un jeton anti-CSRF pour réaliser ce que vous recherchez.

Cet article l'explique plus en détail:Falsifications de requêtes intersites

La source