【问题标题】:Automatically submitting form to HTTPS site, how to authenticate?自动向 HTTPS 站点提交表单,如何进行身份验证?
【发布时间】:2014-11-25 16:07:31
【问题描述】:

我正在编写一个脚本来自动将工单提交到我们的帮助台系统。到目前为止,这是一个非常简单但有效的系统。我有一个带有表单的页面,该表单通过 JavaScript 自动提交,表单值基于请求的 URL。

当您从浏览器访问该页面时,这非常有用。假设您已经通过工单系统页面的身份验证,自动提交的表单会愉快地发送其表单数据,并且您会被定向到工单列表,您可以在其中看到新的自动提交的工单。当然不幸的是,票务系统是一个 HTTPS 安全站点,所以如果您没有登录,您将被定向到登录页面并且自动提交失败。

但是,我们的想法是按计划运行此自动提交,或者远程启动它,其中发起者不一定是人,也不会按照表单提交来使用美味的身份验证 cookie 来照看它。

因此,作为该领域的新手,我的选择似乎是 A)潜入并通过侦听自动提交响应获得真正的混乱,确定是否正在返回登录页面并通过 JS 提交一些凭据(不是一个巨大的交易,因为这种自动化将仅在安全的服务器上运行),然后重新提交表单......或 B)以某种方式通过事先进行身份验证以正确的方式做到这一点。但这就是我的知识结束的地方。

我已经通读了this similar question,但我仍然不够用。只有当相关服务器支持某种形式的身份验证令牌 API 时,这种适当的自动化才可能实现?有没有更直接的方式来连接和请求/提交数据到 HTTPS 站点?我一直在掩饰对 cURL 的一些介绍,但还没有深入研究。

注意:我无法直接访问票证数据库、代码,也无法直接访问运行它的 Web 服务器进程/帐户。我可能可以在同一台机器上运行进程,这就是为什么我并不真正关心自动提交凭据的安全性,但可能就是这样。

【问题讨论】:

  • 除非您正在执行 ssl 级别的身份验证(例如,每个用户颁发的密钥),否则将 https 网络服务器作为常规 http 服务器进行身份验证没有区别。它仍然是响应 http auth 标头或正在提交的表单而提交的用户名/密码。只要您保留任何 cookie/标头和/或在每个请求中提交用户/传递,两种模式之间的唯一区别就是 url 中的 https 而不是 http
  • 它可能最简单的方法是在服务器超时之前在后台的计时器上继续重新加载 iframe 以保持会话处于活动状态。您可以隐藏 iframe。我已经在生产站点上做到了这一点,它运行良好,根本不需要修改后端。
  • 这个“帮助台系统”有名字吗,很多都有API
  • 你提交的那个服务器,它允许匿名提交吗?您解释的问题与https协议无关。
  • 你能用 PHP 来代替吗?使用诸如 Goutte 之类的 cookie 感知浏览器库来执行此操作 - 只要不依赖于 JavaScript,它应该可以工作。 (Goutte 包装了 Guzzle,它包装了 cURL - 所以你的问题是正确的。但是,这将为你做很多工作)。

标签: javascript php forms authentication https


【解决方案1】:

首先,如果您尚未通过身份验证,您的票务系统是否将您引导至登录屏幕与 HTTPS 无关 - 这将是一个用户名/密码 <form> 然后设置一个 cookie,或者它将是WWW-Authenticate 标头。无论您使用的是 HTTPS 还是纯 HTTP,都可以使用其中的每一个。

无论它使用哪种方法,如果您打算在网络浏览器中执行此操作,您可能无法执行此操作,因为 CORS (cross-origin resource sharing) 可能尚未设置为允许它。

但是,如果您是通过 Node.js、Python、PHP 或其他任何可以发出任意 HTTP(S) 请求的脚本来执行此操作的,您可能希望查看如下流程:

  1. 请求票务系统的索引页
  2. 检测它是否为您提供了登录屏幕
  3. 如果是这样,请从登录屏幕获取任何必要的数据(例如随机数)并发出 POST 请求,就像您自己填写用户名/密码一样
  4. 检查身份验证是否成功(基于 POST 响应)
  5. 保留您的 POST 请求返回的 cookie,并使用它来提交工单。

对于系统使用WWW-Authenticate 标头的更简单的情况,它会是这样的:

  1. 请求票务系统的索引页
  2. 检测收到的HTTP 401 响应中的WWW-Authenticate 标头
  3. 发送带有适当值的Authorization 标头
  4. 检查身份验证是否成功(基于获取HTTP 200 而不是HTTP 401
  5. 在提交工单时再次发送相同的Authorization 标头。

在 Wikipedia 上描述了使用 WWW-Authenticate 进行 basicdigest 身份验证。

【讨论】:

  • 谢谢。这是我想到的两个想法,但不够熟练,无法在我的问题中表达出来。理想情况下,我会尝试使用您建议的第二种方法,因为它更简洁,而且我不喜欢依赖登录页面的某些可能会改变的指标。
猜你喜欢
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 2017-11-01
相关资源
最近更新 更多