【问题标题】:How to access a password protected site using python?如何使用 python 访问受密码保护的站点?
【发布时间】:2011-11-29 08:45:19
【问题描述】:

我在想,如果我使用 python 的机制访问受密码保护的站点,我会得到一个需要身份验证数据的 401 Unauthorized 错误。

所以在我的脚本中,我尝试访问显然需要用户名和密码的雅虎邮箱,我以为我会得到 401,但我没有。

代码:

yahoo_mail = 'http://mail.cn.yahoo.com'
br = mechanize.Browser()
r = br.open(yahoo_mail)
print r.info()  #here, I got 200, it's ok apparently

br.select_form(nr=0)  #select the login form
r = br.submit()  #submit the form without providing username and password
print r.info()  #but I didn't get 401, why?

问题:

  1. 为什么我没有提供 auth-info 就没有得到 401?
  2. 如果不是我的邮箱,其他网站可以给我一个 401 吗?

【问题讨论】:

  • 我认为你的意思是 401 Unauthorized,而不是 410 Gone

标签: python authentication mechanize


【解决方案1】:
  1. 身份验证失败并不意味着您无权查看身份验证背后的页面。这意味着您不会看到将您的凭据考虑在内的此页面版本。如果您在主页上并且未通过身份验证,您仍然可以看到主页。

  2. 搜索引擎似乎没有索引 401 页面,因此可能有点难以找到...

【讨论】:

    【解决方案2】:

    现在大多数网站使用 HTTP 身份验证。所以登录失败不会返回401;而是返回一个正常的 200 成功响应,并且网页inside的文字说您没有登录。

    相反,网站使用 cookie。这意味着您的浏览器实际上并不知道它登录了哪些站点;当您最终向 Yahoo! 提供成功的密码时,它会更改它存储在浏览器中的 cookie,或者甚至可能保持 cookie 不变,但只是更改与 cookie 关联的数据库记录。

    所以HTTP状态码在登录的过程中一般是没用的。相反,你必须刮掉返回的“200成功”页面的文字,看看它是祝贺你登录还是重复表单;或者,您也可以只检查返回的页面的 URL,看看它是否再次是登录表单,或者它是否是您想要访问的目的地。

    【讨论】:

      【解决方案3】:

      看起来雅虎只是在他们的代码中处理密码验证。尝试将以下两行添加到您的代码中:

      f = open('a.html', 'w')
      f.write(r.read())
      

      当您阅读该页面时,您将再次看到相同的页面。

      看起来他们只是有一点 javascript 告诉你你的密码是错误的。

      【讨论】:

      • 您在意识到身份验证可能不是通过 HTTP 完成的方面是正确的,但是通过 Javascript 进行的密码身份验证根本不安全。正如 Brandon 的回答所暗示的,他们在服务器端代码中进行密码验证,并在客户端存储一个 cookie。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      相关资源
      最近更新 更多