2010-11-22 58 views
4

J'essaie d'utiliser python/mécaniser pour vous connecter à cette page: http://www.solaradata.com/cgi-bin/mainProgram.cgiUtilisation de mécaniser python pour se connecter sur la page web avec la fonction javascript hash md5

Le formulaire de connexion utilise une fonction Javascript qui produit un hachage MD5 de plusieurs valeurs de champ avant de soumettre les résultats pour l'authentification. Comme mechanize ne peut pas faire javascript, j'ai essayé de reproduire la même fonctionnalité à l'intérieur de python et ensuite soumettre les valeurs résultantes. Cependant, je reçois toujours des erreurs "utilisateur/mot de passe invalide".

Voici mon code actuel, quelqu'un peut-il me diriger vers où je me suis trompé? Merci!

url_login = 'http://www.solaradata.com/cgi-bin/mainProgram.cgi' 

import mechanize 
import md5 

username = 'superfly' #not my real user/pass 
password = 'stickyguy' #not my real user/pass 

br = mechanize.Browser() 
br.open(url_login) 
br.select_form(nr=0) 
br.set_all_readonly(False) 

session  = br['session'] 
br['user']  = username 
br['password'] = password 

m1 = md5.new() 
m1.update(password + username) 
br['password'] = m1.digest() 

m2 = md5.new() 
m2.update(password + session) 
br['hash'] = m2.digest() 

for form in br.forms(): 
    #print form 

    request2 = form.click() # mechanize.Request object 
    try: 
     response2 = mechanize.urlopen(request2) 
    except mechanize.HTTPError, response2: 
     pass 

    print response2.geturl() 
    # headers 
    for name, value in response2.info().items(): 
     if name != "date": 
      print "%s: %s" % (name.title(), value) 
    print response2.read() # body 
    response2.close() 

Répondre

0

Je ne suis pas familier avec python, mais il semble que la ils reviennent la valeur hexadécimale du hachage MD5 dans la version javascript de l'algorithme. Est-ce que le python MD5 fait la même chose?

Vous devriez être en mesure de tester cela sans passer par le processus de soumission et de tester le succès. Au lieu de cela, en utilisant un outil de développement JavaScript tel que les outils de développement Firebug ou Chrome, calculez le résultat obtenu sur la page. Ensuite, en utilisant les mêmes entrées, voyez ce que vous obtenez de votre programme. Ils devraient correspondre, caractère pour le caractère.

+0

bonne prise - je n'ai pas vu ça. La fonction JavaScript appelée onSubmit est en fait assez compliquée: function calcMD5 (str) {return binl2hex (coreMD5 (str2binl (str)))}. Est-ce que j'ai bien lu que c'est (1) convertir la chaîne en binaire, (2) calculer le hachage MD5, et (3) convertir le résultat en base12 hex? – superfly

+0

Voilà ce que cela me semble. Sautez dans firebug et exécutez calcMD5 (password.value + user.value); et calcMD5 (password.value + session.value) pour voir ce qu'ils obtiennent. Utilisez les mêmes entrées dans votre programme pour comparer. Une fois que vous les obtenez identiques, vous êtes prêt à partir. – Matt

+0

J'ai regardé la conversion des trois fonctions javascript dans la page (str2binI, coreMD5, binI2hex) et essayé de les convertir en python, mais ils sont au-delà de ma compréhension de javascript :( – superfly

1

Utilisez m1.hexdigest() au lieu de m1.digest()

+0

J'ai essayé cela, mais cela seul ne semble pas faire l'affaire (malheureusement) – superfly

+0

Cela devrait fonctionner :-) Le HTML utilise la fonction javascript calcMD5. J'ai essayé de courir que par Opera Dragonfly: >>> calcMD5 ("a") "0cc175b9c0f1b6a831c399e269772661" Ce qui est le même résultat que vous obtenez en cours d'exécution: >>> m1 = md5.new() >> > m1.update ("a") >>> m1.hexdigest() '0cc175b9c0f1b6a831c399e269772661' Les résultats diffèrent s'il existe des caractères à haut débit dans l'entrée. Peut-être que c'est le problème? –

0

Il sera ainsi surpuissant mais si vous avez vraiment besoin d'accéder scripter un site lourd javascript vous pouvez regarder les laboratoires de sélénium rc ou source.

Ces outils vous permettent de créer un script identique à celui d'un utilisateur.

Selenium