Python CookieJar сохраняет cookie, но не отправляет его на веб-сайт

Я пытаюсь войти на сайт, используя urllib2 и cookiejar. Он сохраняет идентификатор сеанса, но когда я пытаюсь открыть другую ссылку, требующую аутентификации, он говорит, что я не вошел в систему. Что я делаю неправильно?

Вот код, который у меня не работает:

import urllib
import urllib2
import cookielib

cookieJar = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))

# Gives response saying that I logged in succesfully
response = opener.open("http://site.com/login", "username=testuser&password=" + md5encode("testpassword"))

# Gives response saying that I am not logged in
response1 = opener.open("http://site.com/check")

person Tom Ray    schedule 24.11.2011    source источник


Ответы (2)


Ваша реализация выглядит нормально... и должна работать.

Он должен отправлять правильный cookies, но я вижу это как случай, когда сайт на самом деле не регистрирует вас.

Как вы можете говорить, что он не отправляет cookies или может быть cookies, который вы получаете, не тот, который аутентифицирует вас.

Используйте: response.info(), чтобы увидеть заголовки ответов, чтобы увидеть, какие файлы cookie вы получаете на самом деле.

Сайт может не регистрировать вас, потому что:

  • У него есть проверка User-agent, которую вы не устанавливаете, поскольку некоторые сайты открываются из 4 основных браузеров только для запрета доступа ботов.

  • Сайт может искать какое-то специальное скрытое поле формы, которое вы не отправляете.

1 совет:

from urllib import urlencode
# Use urlencode to encode your data

data = urlencode(dict(username='testuser', password=md5encode("testpassword")))
response = opener.open("http://site.com/login", data)

Более того, здесь 1 вещь странная:

  • Вы кодируете свой пароль md5 перед его отправкой. (Странный)
  • Обычно это делается сервером перед сравнением с базой данных.
  • Это возможно, только если site.com реализует md5 в javascript.
  • Это очень редкий случай, так как только 0,01% сайтов делают это.
  • Проверьте это - это может быть проблемой, и вы предоставляете хешированную форму, а не фактический пароль на сервер.
  • Таким образом, сервер снова вычислил бы md5 для вашего хэша md5.

Проверить.. !! :)

person Yugal Jindle    schedule 24.11.2011
comment
Спасибо за ваш ответ. Я работаю над клиентским программным обеспечением для какой-то службы и напрямую общаюсь с человеком, который внедряет php-сервер. Пароль должен быть отправлен в виде хэша md5 по соображениям безопасности. И нет никаких скрытых полей формы. Я попробую использовать механизацию или завиток. - person Tom Ray; 24.11.2011
comment
Рассмотрите возможность присуждения ответа, отказавшись от него и приняв ответ, нажав «галочку» рядом с ответом. Вот как вы благодарите на stackoverflow. - person Yugal Jindle; 24.11.2011
comment
@TomRay Хэширование пароля таким образом перед его отправкой на самом деле ничего не защищает - это просто предоставление производного пароля, который с точки зрения безопасности так же хорош, как и пароль. Тот, кто внедрил эту услугу, не мог ясно мыслить. - person zigg; 21.01.2013

У меня была аналогичная проблема с моим собственным тестовым сервером, который отлично работал с браузером, но не с решением urllib2.build_opener.

Проблема, похоже, в urllib2. Как показывают эти ответы, легко использовать более мощный mechanize вместо urllib2:

cookieJar = cookielib.CookieJar()
browser = mechanize.Browser()
browser.set_cookiejar(cookieJar)
opener = mechanize.build_opener(*browser.handlers)

И открывалка будет работать как положено!

person Webmezha    schedule 18.09.2012