2009-12-08 5 views
10

J'ai une page web contenant un formulaire de connexion qui se charge via HTTP, mais il soumet les données via HTTPS. J'utilise python-mechanize pour me connecter à ce site, mais il semble que les données soient soumises via HTTP.Mécaniser soumettre le formulaire de connexion de http à https

Mon code est ressemble à ceci:

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

Lorsque le formulaire est soumis, la connexion se fait via HTTP et contient quelque chose comme:

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'... 

Quelqu'un peut-il confirmer et éventuellement publier un solution pour que le formulaire soit soumis via HTTPS?

modifier plus tard:

1) J'utilise un proxy HTTP pour le trafic http/https (défini dans l'environnement - machine Linux)
2) Je l'ai regardé le trafic avec Wireshark et je peux confirmer que le trafic est envoyé via HTTP normal (je peux voir le contenu du POST et mécaniser n'envoie pas les mêmes requêtes au proxy qu'un webbrowser - ce dernier envoie CONNECT login.us.site.com:443, alors que mécaniser seulement POSTES https://login.us.site.com). Cependant, je ne sais pas ce qu'il advient des données lorsqu'elles quittent le proxy; peut-être établit-il une connexion SSL au site cible?

+0

votre formulaire semble être soumis via HTTPS. – SilentGhost

+1

Pour le bénéfice des lecteurs plus tard: - C'est une mauvaise pratique d'avoir une page servie sur http post à une URL https. Dans la configuration par défaut, IE (par exemple) va générer un avertissement dans de tels cas .... Si vous le contrôlez, vous devez le servir à partir du même nom d'hôte et du même protocole que celui auquel il sera soumis. Cela donne également à l'utilisateur l'icône de cadenas rassurante. (C'est une défense contre les attaques man-in-the-middle - si le formulaire est sur HTTP, un attaquant MIM peut modifier le formulaire et peut injecter javascript pour contrôler ce que vous soumettez à l'URL HTTPS). – Ben

Répondre

2

mechanize utilise urllib2 en interne et plus tard avait un bug: HTTPS over (Squid) Proxy fails. Le bug est corrigé dans Python 2.6.3, donc la mise à jour de Python devrait résoudre votre problème.

+0

Bien que ce bug semble effectivement lié, je doute que ce soit la faute d'urllib2, d'abord parce que je lance python 2.6.4 (mise à jour dans ma distribution Ubuntu) et ensuite parce que j'ai écrit un programme de test demandant https: //www.paypal. com qui envoie en effet CONNECT à travers le proxy. Donc, il semble être un problème lié à mécaniser .. – Unknown

+0

Strange. J'utilise urllib2 et capable de urllib2.urlopen la page, mais je reçois les mêmes erreurs en utilisant urllib ou mechanize. – Vestel