2011-01-07 1 views
8

OK, voici l'en-tête (juste un exemple) info je suis arrivé d'en-tête en direct HTTP lors de la connexion à un compte:Comment obtenir mécaniser demandes de regarder comme ils proviennent d'un vrai navigateur

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 

Normalement, je code comme ceci:

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) 

Le code ci-dessus fonctionne très bien. Ma question est, ai-je aussi besoin d'ajouter ces lignes suivantes (et plus dans les infos de l'en-tête précédent) dans LoginHeader pour faire ressembler vraiment à la navigation de firefox, pas mécaniser? Quelles parties/combien d'informations d'en-tête doivent être usurpées pour qu'elles aient l'air «réelles»?

Répondre

6

Cela dépend de ce que vous essayez de «tromper». Vous pouvez essayer des services en ligne qui ne simples renifler User Agent pour évaluer votre succès:

http://browserspy.dk/browser.php

http://www.browserscope.org (chercher 'Nous pensons que vous utilisez ...')

http://www.browserscope.org/ua

http://panopticlick.eff.org/ -> vous aidera à choisir certains 'trop communs pour suivre les' options de

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

Je crois qu'un programmeur déterminé pourrait détecter votre jeu, mais beaucoup de parseurs et d'outils de notation ne feraient pas une fois que vous faites écho ce que votre vrai navigateur envoie.

Une chose que vous devriez considérer est que l'absence de JS pourrait déclencher des drapeaux rouges, donc capturer les en-têtes envoyés avec JS désactivé aussi.

+0

Merci encore, mate! – Shane

+0

Existe-t-il un outil pour surveiller vos connexions réseau de scripts? Donc je connaîtrais les données transmises entre le serveur et mon script. – Shane

+0

JavaScript? Live HTTP Headers devrait le faire. Script Python? Plus dur, mais un logiciel de reniflage de paquets comme WireShark le ferait. Dans les deux cas, vous obtiendrez beaucoup de bruit non-script, mais il peut encore vous donner beaucoup d'informations utiles. – TryPyPy

5

Voilà comment vous définissez l'agent utilisateur pour toutes les demandes faites par mechanize.Browser

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

Mechanize peut remplir des formulaires et

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

Voir la mechanize examples pour plus d'infos

0

Si vous êtes paranoïaque à propos de la suppression des bots/scripts/navigateurs non réels, vous rechercheriez des choses comme l'ordre des requêtes HTTP, laissez une ressource être ajoutée en utilisant JavaScript. Si cette ressource n'est pas demandée, ou demandée avant le JavaScript, alors vous savez que c'est un "faux" navigateur. Vous pouvez également regarder le nombre de demandes par connexion (keep-alive), ou simplement vérifier que tous les fichiers CSS de la première page (étant donné qu'ils sont en haut du code HTML) sont chargés.

YMMV mais il peut être assez difficile de simuler suffisamment pour faire passer un "faux" navigateur comme un "réel" (utilisé par les humains).

Questions connexes