Vă mulțumim pentru susținere

Blochează accesul utilizatorilor la intervalele unui site utilizând HTTP_REFERER

Am control asupra HttpServer, dar nu asupra aplicației ApplicationServer sau a aplicațiilor Java care stau acolo, dar trebuie să blochez accesul direct la anumite pagini ale acestor aplicații. Tocmai nu vreau ca utilizatorii să automatizeze accesul la formularele care emite solicitări directe GET / POST HTTP către servletul corespunzător.

Deci, am decis să blochez utilizatorii pe baza valorii HTTP_REFERER . La urma urmei, dacă utilizatorul navighează în interiorul site-ului, acesta va avea un HTTP_REFERER corespunzător. Ei bine, asta am crezut.

Am implementat o regulă de rescriere în fișierul .htaccess care spune:

RewriteEngine on 

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

M-am așteptat să interzic accesul utilizatorilor care nu navigau pe site, dar să emită cereri directe GET către servletele "servlet1" sau "servlet2" folosind interogări. Dar așteptările mele s-au încheiat brusc, deoarece expresia regulată (servlet1 | servlet2) /.+\? .+ nu a funcționat deloc.

Am fost foarte dezamăgit când mi-am schimbat expresia la (servlet1 | servlet2) /.+ și a funcționat atât de bine încât utilizatorii mei au fost blocați indiferent dacă au navigat pe site sau nu.

Deci, întrebarea mea este: Cum pot realiza acest lucru de a nu permite "roboților" cu acces direct la anumite pagini dacă nu am acces / privilegii / timp pentru a modifica aplicația?

0
adăugat editat

9 răspunsuri

Nu puteți să-i spuneți utilizatorilor și scripturilor rău intenționate prin solicitarea lor http. Dar puteți analiza utilizatorii care solicită prea multe pagini într-un timp prea scurt și blochează adresele IP.

0
adăugat

Nu am o soluție, dar pun pariu că faptul că se bazează pe referrer nu va funcționa niciodată, deoarece agenții utilizatorilor sunt liberi să nu le trimit deloc sau să le spună ceva care le va permite.

0
adăugat

Dacă încercați să împiedicați accesarea anumitor pagini de către motoarele de căutare, asigurați-vă că utilizați un robots.txt fișier.

Utilizarea HTTP_REFERER nu este fiabilă deoarece este ușor de falsificat .

O altă opțiune este de a verifica șirul de agent utilizator pentru boti cunoscuți (aceasta poate necesita modificarea codului).

0
adăugat

Javascript este un alt instrument util pentru a împiedica (sau cel puțin întârzia) ștergerea ecranului. Majoritatea instrumentelor automate de răzuire nu au un interpret Javascript, astfel încât să puteți face lucruri precum setarea câmpurilor ascunse etc.

Editați: ceva de-a lungul liniilor acest articol Phil Haack .

0
adăugat

Pentru a face lucrurile puțin mai clare:

  1. Da, știu că folosirea HTTP_REFERER este complet nesigură și oarecum copilăroasă, dar sunt destul de sigur că oamenii care au învățat (de la mine poate?) să facă automatizări cu Excel VBA nu vor ști cum să submineze un HTTP_REFERER în intervalul de timp pentru a avea soluția finală.

  2. Nu am acces / privilegiu pentru a modifica codul aplicației. Politică. Crezi asta? Deci, trebuie să aștept până când titularul drepturilor va face modificările pe care le-am solicitat.

  3. Din experiențele anterioare, știu că modificările solicitate vor dura două luni pentru a intra în producție. Nu, aruncându-le Metodologiile agile Cărțile din cap nu au îmbunătățit nimic.

  4. Aceasta este o aplicație intranet. Așa că nu am prea mulți tineri care încearcă să-mi submineze prestigiul. Dar sunt destul de tânăr ca să încerc să subminez prestigiul "unei servicii de consultanță globală foarte bogată care vine din India", dar unde, curios, nu există nici un singur indian care să lucreze acolo.

Până acum, cel mai bun răspuns vine de la "Michel de Mare": blochează utilizatorii pe baza IP-urilor lor. Ei bine, asta am făcut ieri. Astăzi am vrut să fac ceva mai generic pentru că am o mulțime de utilizatori de cangur (sărind de la o adresă IP la alta) pentru că folosesc VPN sau DHCP.

0
adăugat

Bănuiesc că încercați să împiedicați răzuirea ecranului?

În opinia mea sinceră, este greu de rezolvat și de încercarea de a repara verificând valoarea HTTP_REFERER este doar un tencuială lipită. Oricine se duce la deranjul automatizării depunerilor va fi destul de priceput să trimită refererătorul corect din "automatul" lor.

Ai putea încerca să limitezi tariful, dar fără a modifica aplicația pentru a forța un fel de validare a unei persoane (un CAPTCHA) într-un anumit moment, atunci vei găsi acest lucru greu de prevenit.

0
adăugat

Utilizarea unui referrer este foarte nesigură ca metodă de verificare. După cum au menționat și alți oameni, este ușor de falsificat. Cea mai bună soluție este să modificați aplicația (dacă puteți)

Ați putea să utilizați un CAPTCHA sau să setați un fel de modul cookie sau sesiune care să țină evidența paginii pe care ultima vizită a utilizatorului (o sesiune ar fi mai greu de confundat) și să urmărească istoricul vizualizării paginii și să permită numai utilizatorilor care au navigat paginile necesare pentru a ajunge la pagina pe care doriți să o blocați.

Acest lucru vă impune, în mod evident, să aveți acces la aplicația în cauză, totuși este modul cel mai prost (nu complet, dar suficient de bun în opinia mea).

0
adăugat

S-ar putea să utilizați un jeton anti-CSRF pentru a obține ceea ce căutați.

This article explains it in more detail: Cross-Site Request Forgeries

0
adăugat

Nu sunt sigur dacă pot rezolva acest lucru dintr-o dată, dar putem merge înainte și înapoi după cum este necesar.

În primul rând, vreau să repet ceea ce cred că spuneți și să vă asigurați că sunt clar. Doriți să respingeți cererile pentru servlet1 și servlet2 este că cererea nu are referenterul potrivit și are un șir de interogare? Nu sunt sigur că înțeleg (servlet1 | servlet2) /.+\?.+ pentru că se pare că aveți nevoie de un fișier în servlet1 și 2. Cred că ați combinat PATH_INFO (înainte de "?") Cu un GET șir de interogare (după "?"). Se pare că partea PATH_INFO va funcționa, dar testul de interogare GET nu va funcționa. Am făcut un test rapid pe serverul meu folosind script1.cgi și script2.cgi și următoarele reguli au lucrat pentru a realiza ceea ce cereți. Ele sunt, evident, editate un pic pentru a se potrivi cu mediul meu:

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

Cele de mai sus au prins toate cererile greșite de referință la script1.cgi și script2.cgi care au încercat să trimită datele utilizând un șir de interogări. Cu toate acestea, puteți să trimiteți și datele utilizând o cale_info și prin postarea datelor. Am folosit acest formular pentru a proteja împotriva oricăreia dintre cele trei metode folosite cu un referer incorect:

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]

Pe baza exemplului pe care încercai să îl faci, cred că asta este ceea ce dorești:

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

Sperăm că acest lucru vă va aduce mai aproape de obiectivul dvs. Spuneți-ne cum funcționează, mă interesează problema dvs.

(BTW, sunt de acord că blocarea jurnalistului este o securitate slabă, dar înțeleg, de asemenea, că forțele de relaționare impun uneori soluții imperfecte și parțiale, pe care deja le recunoașteți.)

0
adăugat