2009-12-08 4 views
10

Ho una pagina Web contenente un modulo di accesso che viene caricato tramite HTTP, ma invia i dati tramite HTTPS.Mechanize invia il modulo di accesso da http a https

Sto usando python-mechanize per accedere a questo sito, ma sembra che i dati vengano inviati tramite HTTP.

Il mio codice è simile a questo:

import mechanize 
b = mechanize.Browser() 
b.open('http://site.com') 
form = b.forms().next() # the login form is unnamed... 
print form.action  # prints "https://login.us.site.com" 
form['user'] = "guest" 
form['pass'] = "guest" 
b.form = form 
b.submit() 

Quando il modulo viene inviato, il collegamento avviene tramite HTTP e contiene qualcosa come:

send: 'POST https://login.us.site.com/ HTTP/1.1\r\nAccept-Encoding: identity\r\nContent-Length: 180\r\nHost: login.us.site.com\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n'... 

Qualcuno può confermare ed eventualmente inviare un soluzione in modo che il modulo venga inviato tramite HTTPS?

Successivamente modificare:

1) Io sto usando un proxy HTTP per il traffico HTTP/HTTPS (set nell'ambiente - macchina Linux)
2) Ho guardato il traffico con Wireshark e posso confermare che il traffico viene inviato tramite HTTP normale (posso vedere il contenuto del POST e mechanize non invia le stesse richieste al proxy come un browser web - quest'ultimo invia CONNECT login.us.site.com:443, mentre meccanizza solo POST https://login.us.site.com). Tuttavia, non so cosa succede ai dati quando lascia il proxy; forse stabilisce una connessione SSL al sito di destinazione?

+0

il modulo sembra essere presentate tramite HTTPS. – SilentGhost

+1

Per il beneficio dei lettori successivi: - È una cattiva pratica avere una pagina pubblicata su un post http in un URL https. Nella configurazione di default IE (ad esempio) genererà un avviso in questi casi .... Se è sotto il vostro controllo, dovreste servire il modulo dallo stesso nome host e protocollo a cui sarà sottoposto. Ciò fornisce anche all'utente l'icona del lucchetto rassicurante. (È una difesa contro gli attacchi man-in-the-middle: se il modulo è su HTTP, un utente malintenzionato MIM può alterare il modulo e può iniettare javascript per controllare ciò che si invia all'URL HTTPS). – Ben

risposta

2

mechanize utilizza urllib2 internamente e il successivo ha un errore: HTTPS over (Squid) Proxy fails. Il bug è corretto in Python 2.6.3, quindi l'aggiornamento di Python dovrebbe risolvere il tuo problema.

+0

Anche se questo bug sembra correlato, dubito che sia colpa di urllib2, prima perché eseguo python 2.6.4 (aggiornato nella mia distribuzione Ubuntu) e secondo perché ho scritto un programma di test che richiede https: //www.paypal. com che in effetti invia CONNECT tramite il proxy. Quindi sembra essere un problema relativo alla meccanizzazione .. – Unknown

+0

Strano. Sto usando urllib2 e sono in grado di urllib2.urlopen la pagina, ma ricevo gli stessi errori usando urllib o mechanize. – Vestel