3

我在 Access 2007 VBA 中使用 WinHTTP 来获取一些需要cookie 登录凭据帐户的项目列表。

首先,我通过https://www.example.com/login.php登录:

  Dim strCookie As String, strResponse As String, _
    strUrl As String
'
  Dim xobj As Object
'
  Set xobj = New WinHttp.WinHttpRequest
'
  strUrl = "https://www.example.com/login.php"
  xobj.Open "POST", strUrl, False
  xobj.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
  xobj.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  xobj.Send "username=johndoe2&password=mypassword"
'
  strCookie = xobj.GetResponseHeader("Set-Cookie")
  strResponse = xobj.ResponseText

strResponse的内容表明我的登录是好的,因为johndoe2在这个字符串中是受欢迎的。strCookie保存登录成功后 HTTP 服务器返回的 Set-Cookie。

接下来,我需要获取一个仅供登录用户访问的机密页面:https ://www.example.com/secret-contents.php 。我这样做,使用以前的 Set-Cookie 标头strCookie,重新发送到服务器:

'
' now try to get confidential contents:
'
  strUrl = "https://www.example.com/secret-contents.php"
  xobj.Open "GET", strUrl, False
  xobj.SetRequestHeader "Cookie", strCookie
  xobj.Send
'
  strCookie = xobj.GetResponseHeader("Set-Cookie")
  strResponse = xobj.ResponseText

不幸的是,它失败了,因为新的strResponse表明获取的内容不是必需的,而是登录页面。而且strCookie也发生了变化。

这已经过测试并且没有任何效果,因为它仅适用于 Windows/OS 链接身份验证,例如著名的基本、NTLM、摘要和 Kerberos 身份验证,不适用于基于 cookie 的身份验证:

xobj.SetCredentials "johndoe2", "mypassword", 0

除了 Set-Cookie 之外,还有什么可以作为标头发送到远程服务器,以便使用先前认证的凭证?

服务器使用typo3 CMS 框架。

4

1 回答 1

4

在这半天里,我终于弄清楚了如何使用之前的登录凭证进行后续请求,感谢Alex K.的帮助,fiddler2开启了进入 HTTP headers 世界的大门。我想分享今天对我有用的东西。

该工作包括 2 个步骤,通过 URL1 登录,然后获取所需凭据 URL2 的 HTML 内容。

1.通过URL1登录,保持与问题相同:

  Dim strCookie As String, strResponse As String, _
    strUrl As String
'
  Dim xobj As Object
'
  Set xobj = New WinHttp.WinHttpRequest
'
  strUrl = "https://www.example.com/login.php"
  xobj.Open "POST", strUrl, False
  xobj.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
  xobj.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  xobj.Send "username=johndoe2&password=mypassword"
'
  strCookie = xobj.GetResponseHeader("Set-Cookie")
  strResponse = xobj.ResponseText

2.获取用户名/密码保护的URL2的内容:

'
' now try to get confidential contents:
'
  strUrl = "https://www.example.com/secret-contents.php"
  xobj.Open "GET", strUrl, False
'
' these 2 instructions are determining:
'
  xobj.SetRequestHeader "Connection", "keep-alive"
  xobj.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
'
  xobj.SetRequestHeader "Cookie", strCookie
  xobj.Send
'
  strCookie = xobj.GetResponseHeader("Set-Cookie")
  strResponse = xobj.ResponseText

人们注意到在第二步中使用了两个额外的标头发送到 HTTP 服务器:

“连接”、“保持活动”

“User-Agent”、“我的伪装导航员blabla……”

没有它们,无法成功获取 URL2,相反,配置良好的网站会将您重定向到 URL1 以再次进行身份验证。

一言以蔽之,会话必须具有保持活动连接才能重新使用获得的登录凭据。

这对于httphttps协议无所谓。

HTML 登录输入字段名称取决于目标站点,此处为usernamepassword网站的设计者可以使用用户通行证等字眼;登录用户登录密码;...您可以通过查看登录表单的源代码轻松地弄清楚这一点。

于 2013-10-10T18:06:45.277 回答