2011-01-07 14 views
8

OK, ecco il colpo di testa (solo un esempio) Info che ho ricevuto da vivo HTTP Header durante l'accesso a un account:Come arrivare meccanizzare le richieste a guardare come essi provengono da un vero e proprio navigatore

http://example.com/login.html 

POST /login.html HTTP/1.1 
Host: example.com 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 GTB7.1 (.NET CLR 3.5.30729) 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 115 
Connection: keep-alive 
Referer: http://example.com 
Cookie: blahblahblah; blah = blahblah 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 39 
username=shane&password=123456&do=login 

HTTP/1.1 200 OK 
Date: Sat, 18 Dec 2010 15:41:02 GMT 
Server: Apache/2.2.3 (CentOS) 
X-Powered-By: PHP/5.2.14 
Set-Cookie: blah = blahblah_blah; expires=Sun, 18-Dec-2011 15:41:02 GMT; path=/; domain=.example.com; HttpOnly 
Set-Cookie: blah = blahblah; expires=Sun, 18-Dec-2011 15:41:02 GMT; path=/; domain=.example.com; HttpOnly 
Set-Cookie: blah = blahblah; expires=Sun, 18-Dec-2011 15:41:02 GMT; path=/; domain=.example.com; HttpOnly 
Cache-Control: private, no-cache="set-cookie" 
Expires: 0 
Pragma: no-cache 
Content-Encoding: gzip 
Vary: Accept-Encoding 
Content-Length: 4135 
Keep-Alive: timeout=10, max=100 
Connection: Keep-Alive 
Content-Type: text/html; charset=UTF-8 

Normalmente avrei codice come questo:

import mechanize 
import urllib2 

MechBrowser = mechanize.Browser() 
LoginUrl = "http://example.com/login.html" 
LoginData = "username=shane&password=123456&do=login" 
LoginHeader = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 GTB7.1 (.NET CLR 3.5.30729)", "Referer": "http://example.com"} 

LoginRequest = urllib2.Request(LoginUrl, LoginData, LoginHeader) 
LoginResponse = MechBrowser.open(LoginRequest) 

Sopra il codice funziona correttamente. La mia domanda è, devo aggiungere anche queste righe seguenti (e altre informazioni nelle intestazioni precedenti) in LoginHeader per renderlo davvero simile alla navigazione in Firefox, non alla meccanizzazione?

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 

Quali parti/quante informazioni di intestazione devono essere falsificate per far sembrare "reale"?

risposta

6

Dipende da cosa stai cercando di "ingannare". È possibile provare alcuni servizi online che Agente semplice utente sniffing per misurare il vostro successo:

http://browserspy.dk/browser.php

http://www.browserscope.org (cercare 'Pensiamo che si sta utilizzando ...')

http://www.browserscope.org/ua

http://panopticlick.eff.org/ -> vi aiuterà a scegliere alcune opzioni 'troppo comuni per monitorare'

http://networking.ringofsaturn.com/Tools/browser.php

Credo che un determinato programmatore potrebbe rilevare il tuo gioco, ma molti parser e strumenti di registro non potrebbero nemmeno una volta che tu fai eco a ciò che il tuo vero browser invia.

Una cosa che dovresti considerare è che la mancanza di JS potrebbe sollevare bandiere rosse, quindi anche catturare le intestazioni inviate con JS disabilitato.

+0

Grazie ancora, amico! – Shane

+0

Esiste uno strumento per monitorare le connessioni di rete degli script? Quindi vorrei conoscere i dati trasmessi tra il server e il mio script. – Shane

+0

JavaScript? Le intestazioni HTTP in tempo reale dovrebbero farlo. Script Python? Più difficile, ma un software sniffing di pacchetti come WireShark lo farebbe. In entrambi i casi, si otterrebbe un sacco di rumore non di script, ma può comunque fornire molte informazioni utili. – TryPyPy

5

Ecco come si imposta il programma utente per tutte le richieste fatte da mechanize.Browser

br = mechanize.Browser() 
br.addheaders = [('User-agent', 'your user agent string here')] 

Mechanize può compilare moduli e

br.open('http://yoursite.com/login') 
br.select_form(nr=1) # select second form in page (0 indexed) 
br['username'] = 'yourUserName' # inserts into form field with name 'username' 
br['password'] = 'yourPassword' 
response = br.submit() 
if 'Welcome yourUserName' in response.get_data(): 
    # login was successful 
else: 
    # something went wrong 
    print response.get_data() 

Vedere la mechanize examples per maggiori informazioni

0

Se sei paranoico riguardo la possibilità di tenere bot/script/browser non reali, dovresti cercare cose come l'ordine delle richieste HTTP, lasciare che una risorsa venga aggiunta usando JavaScript. Se tale risorsa non viene richiesta o richiesta prima di JavaScript, allora sai che è un browser "finto". Puoi anche vedere il numero di richieste per connessione (keep-alive), o semplicemente verificare che tutti i file CSS della prima pagina (dato che sono nella parte superiore dell'HTML) vengano caricati.

YMMV ma può diventare piuttosto ingombrante da simulare quanto basta per far passare un "falso" browser come "reale" (utilizzato dagli umani).

Problemi correlati