Frage

Ich habe die Kontrolle über den HttpServer, aber nicht über den ApplicationServer oder die Java-Anwendungen, dort zu sitzen, aber ich muß verhindert den direkten Zugriff auf bestimmte Seiten dieser Anwendungen.Genau, ich weiß nicht möchten, dass Benutzer die Automatisierung der Zugang zu den Formularen die Erteilung direkter GET/HTTP-POST-Anfragen an das entsprechende servlet.

Also entschied ich mich, Nutzer zu sperren, basierend auf dem Wert von HTTP_REFERER.Nach alle, wenn der Benutzer das navigieren innerhalb der Website, es wird eine entsprechende HTTP_REFERER.Gut, das war es, was ich dachte.

Implementiert habe ich eine rewrite-Regel in der .htaccess-Datei, die sagt:

RewriteEngine on 

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

Ich hatte erwartet, verbieten Sie den Zugriff für Benutzer, die nicht die Website navigieren aber das Problem direkten GET-Anfragen an die "servlet1" oder "servlet2" servlets Verwendung von Abfragezeichenfolgen.Aber meine Erwartungen endete abrupt, weil Sie den regulären Ausdruck (servlet1|servlet2)/.+\?.+ hat nicht gearbeitet.

Ich war wirklich enttäuscht, als ich geändert, die Ausdruck (servlet1|servlet2)/.+ und es funktionierte so gut, dass mein Benutzer gesperrt wurden-egal, ob Sie navigiert die Website oder nicht.

So, meine Frage ist:Wie kann ich erreichen kann diese Sache nicht so dass die "Roboter" mit den direkten Zugang zu bestimmten Seiten wenn ich keinen Zugriff mehr habe/Privilegien/Uhrzeit-ändern der Anwendung?

War es hilfreich?

Lösung

Ich bin mir nicht sicher, ob ich dieses Problem lösen in eine gehen, aber wir gehen zurück und her, wie nötig.

Zunächst möchte ich wiederholen, was ich denke, Sie sagen und machen sicher, ich bin klar.Sie möchten, dass Anfragen auf servlet1 und servlet2 ist der Antrag hat nicht die richtige Referenz ist, und es tut ein query-string?Ich bin mir nicht sicher, ich verstehe (servlet1|servlet2)/.+\?.+ da sieht es aus wie Sie sind, die eine Datei unter servlet1 und 2.Ich glaube, Sie sind Kombination von PATH_INFO (vor dem "?") mit einem GET-query-string - (nach dem "?").Es scheint, dass PATH_INFO-Teil wird funktionieren, aber die GET-Abfrage test nicht.Ich machte einen Schnelltest auf meinem server mit skript1.cgi und skript2.cgi und die folgenden Regeln gearbeitet, um zu erreichen, was Sie Fragen für.Sie sind offensichtlich bearbeitet ein wenig an meinem Umfeld:

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

Die oben fing alles falsch-referer-Anfragen zu skript1.cgi und skript2.cgi, der versucht übermittlung von Daten unter Verwendung einer Abfrage-string.Jedoch, Sie können auch senden von Daten über eine path_info ermittelt und durch die Veröffentlichung der Daten.Ich habe dieses Formular, um schützen gegen jede der drei Methoden genutzt, mit falschen referer:

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]

Basierend auf dem Beispiel, das Sie versucht wurden, um zu arbeiten, ich denke, das ist, was Sie wollen:

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

Hoffentlich zumindest bekommt Sie näher an Ihr Ziel.Bitte lassen Sie uns wissen, wie es funktioniert, ich interessiere mich für Ihr problem.

(BTW, ich bin damit einverstanden, dass referer blockieren, ist die schlechte Sicherheit, aber ich verstehe auch, dass relaity Kräfte unvollkommen und teilweise Lösungen manchmal, was Sie scheinen bereits bestätigen.)

Andere Tipps

Ich habe keine Lösung, aber ich Wette, dass sich auf der referrer wird nie funktionieren, weil die user-agents sind frei, nicht senden Sie es an alle-oder spoof-es zu etwas, das Sie in.

Sie können nicht sagen auseinander von Benutzern und böswilligen Skripten durch Ihre http-Anforderung.Aber Sie können analysieren, welche Benutzer anfordern, zu viele Seiten in zu kurzer Zeit, und blockieren Sie Ihre ip-Adressen.

Mit ein referrer ist sehr unzuverlässig, als eine Methode der überprüfung.Wie andere Leute erwähnt haben, ist es leicht gefälscht.Ihre beste Lösung ist, ändern Sie die Anwendung zu (wenn Sie können)

Sie könnte verwenden Sie ein CAPTCHA, oder einige Art von cookie oder Sitzungs-cookie, das verfolgt, welche Seite der Benutzer zuletzt besuchte (eine Sitzung wäre schwerer zu fälschen) und halten track der Seite Verlauf angezeigt und nur zulassen, dass Benutzer durchsucht die Seiten, die nötig ist, um zu der Seite die Sie blockieren möchten.

Dies erfordert natürlich, Sie haben Zugang zu der Anwendung in Frage, aber es ist der sicherste Weg (nicht vollständig, aber "gut genug" ist, meiner Meinung nach.)

Javascript ist ein weiteres hilfreiches Werkzeug, um zu verhindern (oder zumindest hinauszuzögern) Bildschirm kratzen.Am meisten automatisierte scraping-tools, die nicht über einen Javascript-interpreter, damit Sie Dinge tun können, wie Sie ausgeblendete Felder, etc.

Edit:Etwas entlang der Linien von dieser Phil Haack Artikel.

Ich vermute, Sie versuchen zu verhindern, screen scraping?

In meine ehrliche Meinung, es ist eine schwierige Frage zu lösen und zu versuchen, zu beheben, indem der Wert des HTTP_REFERER ist nur ein Heftpflaster.Wer sich die Mühe zu machen die Automatisierung von Veröffentlichungen wird klug genug, um senden Sie die richtigen Referenzen von Ihren 'automaton'.

Sie könnten versuchen, rate limiting, aber ohne Sie tatsächlich zu ändern, die app zu zwingen, eine Art ist-dies-ein-Mensch-Validierung (CAPTCHA) irgendwann dann wirst du das finden, schwer zu verhindern.

Wenn Sie versuchen, zu verhindern, dass Suchmaschinen-bots den Zugriff auf bestimmte Seiten, stellen Sie sicher, dass Sie über eine ordnungsgemäß formatierte robots.txt Datei.

Mit HTTP_REFERER wird unzuverlässig, weil es ist leicht gefälscht.

Eine weitere option ist, um die Benutzer-agent-Zeichenfolge für den bekannten bots (dies kann erfordern, dass code-änderungen).

Um die Dinge ein wenig klarer:

  1. Ja, ich weiß, dass die Verwendung HTTP_REFERER ist völlig unzuverlässig und etwas kindisch, aber ich bin mir ziemlich sicher, dass die Leute, die gelernt (von mir vielleicht?) um Automatisierungen mit Excel-VBA nicht wissen, wie zu untergraben und einen HTTP_REFERER in der Zeitspanne, um die endgültige Lösung.

  2. Ich habe keinen Zugriff/Berechtigung zum ändern der code für die Anwendung.Politik.Glaubst du das?So, ich muss warten, bis der Rechte-Inhaber die änderungen, die ich angefordert.

  3. Aus früheren Erfahrungen weiß ich, dass die angeforderten änderungen wird nehmen zwei Monate zu kommen in die Produktion.Nein, werfen Sie Agiler Methodik Bücher in Ihren Köpfen nicht noch etwas verbessern.

  4. Dies ist eine intranet-app.So dass ich nicht haben eine Menge von Jugendlichen zu unterwandern mein prestige.Aber ich bin jung genug, als zu versuchen, untergraben das ansehen von "einer sehr schicken Globale Beratung, dass kommt aus Indien" aber wo ist Sie neugierig, es gibt nicht einen einzigen Indianer, die dort arbeiten.

So weit, die beste Antwort kommt von "Michel de Mare":blockieren Sie Benutzer basierend auf deren IP-Adressen.Gut, dass ich gestern.Heute wollte ich etwas machen, um mehr generische, weil ich eine Menge von Känguru-Benutzer (springen von einer Ip Adresse zu einem anderen), denn Sie verwenden VPN-oder DHCP.

Sie können möglicherweise verwenden Sie ein anti-CSRF-token zu erreichen, was Sie wollen.

Dieser Artikel erklärt es im detail: Cross-Site Request Forgeries

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top