2011-01-07 7 views
8

OK, aquí está la cabecera (es un ejemplo) información que obtuve de encabezado activo HTTP al iniciar sesión en una cuenta:Como llegar mecanizar peticiones para que parezca que se originan a partir de un navegador real

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 yo código como este:

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) 

El código anterior funciona bien. Mi pregunta es, ¿también necesito agregar estas líneas (y más en las informaciones del encabezado anterior) en LoginHeader para que realmente parezca que Firefox está navegando, no mecanizando?

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 

¿Qué partes/la cantidad de información del encabezado deben ser falsificadas para que se vea "real"?

Respuesta

6

Depende de lo que intentes 'engañar'. Usted puede intentar algunos servicios en línea que hacen sencilla agente de usuario olfateando para medir su éxito:

http://browserspy.dk/browser.php

http://www.browserscope.org (buscar 'Pensamos que está utilizando ...')

http://www.browserscope.org/ua

http://panopticlick.eff.org/ -> le ayudará a elegir algunas opciones 'demasiado comunes para rastrear'

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

Creo que un programador determinado podría detectar su juego, pero muchos analizadores y herramientas de registro no lo harían una vez que haga eco de lo que envía su navegador real.

Una cosa que debes tener en cuenta es que la falta de JS puede provocar una alerta, así que captura los encabezados enviados con JS desactivado también.

+0

Gracias de nuevo, amigo! – Shane

+0

¿Hay alguna herramienta para supervisar las conexiones de red de tus scripts? Entonces sabría la información transmitida entre el servidor y mi script. – Shane

+0

JavaScript? Los encabezados HTTP en vivo deberían hacerlo. Secuencia de comandos de Python? Más difícil, pero un software para olfatear paquetes como WireShark lo haría. En ambos casos, obtendría mucho ruido que no es de guiones, pero aún así puede darle mucha información útil. – TryPyPy

5

Así es como se establece el agente de usuario para todas las solicitudes hechas por mechanize.Browser

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

Mechanize puede rellenar formularios, así

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() 

Ver el mechanize examples para obtener más información

0

Si eres paranoico acerca de mantener bots/scripts/navegadores no reales, buscarías cosas como el orden de las solicitudes HTTP, deja que se agregue un recurso usando JavaScript. Si ese recurso no se solicita o se solicita antes que JavaScript, entonces usted sabe que es un navegador "falso". También puede ver el número de solicitudes por conexión (keep-alive), o simplemente verificar que todos los archivos CSS de la primera página (dado que están en la parte superior del HTML) se carguen.

YMMV pero puede ser bastante engorroso simular lo suficiente como para hacer que un navegador "falso" pase como uno "real" (usado por humanos).

Cuestiones relacionadas