2010-11-22 219 views
4

我試圖使用Python /機械化登錄到該網頁的網頁: http://www.solaradata.com/cgi-bin/mainProgram.cgi使用Python機械化登錄與JavaScript的MD5散列函數

登錄表單使用了幾個產生MD5哈希Javascript函數字段值,然後提交認證結果。由於機械化不能做JavaScript,我試圖複製python中的相同功能,然後提交結果值。但是,我仍然收到「無效的用戶/密碼」錯誤。

這是我現在的代碼,有人可以指向我出錯的地方嗎?謝謝!

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

回答

0

我不熟悉python,但它似乎是返回算法的javascript版本中的MD5散列值的十六進制值。蟒蛇MD5是否也一樣?

您應該可以在不通過提交過程並測試成功的情況下對其進行測試。相反,使用Firebug或Chrome開發人員工具等JavaScript開發人員工具,計算您獲得的頁內結果。然後,使用相同的輸入,看看你從你的程序中得到什麼。他們應該匹配,角色的性格。

+0

好趕 - 我沒看到這個。調用onSubmit的JavaScript函數實際上相當複雜:函數calcMD5(str){return binl2hex(coreMD5(str2binl(str)))}。 (1)將字符串轉換爲二進制,(2)計算MD5散列,(3)將結果轉換爲base12(十六進制)? – superfly 2010-11-22 20:57:15

+0

這就是我所看到的。跳入螢火蟲,並執行calcMD5(password.value + user.value);和calcMD5(password.value + session.value)看看他們得到了什麼。在程序中使用相同的輸入進行比較。一旦你得到他們相同,你很好去。 – Matt 2010-11-22 21:03:09

1

使用m1.hexdigest()而不是m1.digest()

0

它的方式是矯枉過正,但如果你真的需要腳本訪問一個javascript沉重的網站,你可以看看硒-RC或源的實驗室。

這些工具允許您編寫與用戶相同的實際瀏覽器腳本。

Selenium