【问题标题】:How to fill this web form from the command line?如何从命令行填写此 Web 表单?
【发布时间】:2020-03-22 20:44:16
【问题描述】:

我想在网页上填写表格以通过命令行而不是使用浏览器发送一些文件。我发现 cURL 可以为我做到这一点,但我不知道怎么做。除此之外,我发现每个请求的“authenticity_token”更改。如何成功验证和发布我的文件?

我剥离了 html 代码以仅显示输入,见下文。感谢您的观看。

<form action="https://XXXXXXXX.com/aspera/faspex/test/dropbox_submissions" class="well form-horizontal form-horizontal-small-labels" id="send" method="post"><div style="margin:0;padding:0;display:inline"><input name="authenticity_token" type="hidden" value="cU/zhZKnbjk90v57Phmdgewq97lKclj63MtzfCHhEqc=" /></div>

<input id="dropbox_id" name="dropbox[id]" type="hidden" value="738" />

<input id="passcode" name="passcode" type="hidden" value="1738d1bc02755019655dd424Xf2717f1c8a7c579" />

<input id="delivery_title" maxlength="100" name="delivery[title]" size="100" type="text" value="" />

<input id="fileupload" multiple="multiple" name="file" type="file" />

<input id="delivery_source_paths_list" name="delivery[source_paths_list]" type="hidden" />

<input class="btn large primary" data-prompt_password="true" disabled="disabled" id="send_button" name="commit" type="submit" value="Send Package" />

<label>Passphrase:</label>
<input autocomplete="off" id="password" type="password" />

<label>Confirmation:</label>
<input autocomplete="off" id="password_confirmation" type="password" />

</form>

【问题讨论】:

  • 因此,您的问题中描述了一个带有表单的网站,您正试图通过从您自己的应用程序发送 POST 请求来实现这一点。这是你想要做的吗?
  • 是的,基本上就是这样。但我想,它会比这更复杂。在浏览器中,当我单击“提交”时,它实际上会触发一个外部应用程序 (Aspera Connect) 来启动文件传输。所以我猜网站上一定有一些javascript在运行。我想要实现的是:我不想在浏览器中打开网站,填写表格并提交,我想在查找器中选择一些文件,用相应的路径填写表格并启动传输。
  • 在您的应用程序中使用 iframe 怎么样?
  • 我不想手动填写表格,因为大多数字段保持不变,只需要填写要发布的文件。这应该是当前在 Mac 上的 finder 中选择的文件。

标签: forms curl


【解决方案1】:

这似乎是一个 IBM Aspera Faspex 提交页面。

事实上,实际的文件传输将使用 IBM Aspera FASP 协议完成(客户端免费)。

您可以使用以下免费客户端,它允许您使用经过身份验证的访问或公共访问(在 url 中使用密码)发送到 faspex:

https://www.rubydoc.info/gems/asperalm

示例:

mlia faspex package send --link='https://faspex.org.com/aspera/faspex/external/dropbox_submissions/new?passcode=xxx123xxx.........' --delivery-info=@json:'{"title":"my title"}' /path/to/files

【讨论】:

  • 正是我想要的。我试图用 aspera CLI 做到这一点,但即使是 IBM 支持人员也确认无法提交到公共保管箱。所以我放弃了……非常感谢!
  • 我还有一个关于加密/解密的问题。当我使用网络表单将文件上传/下载到系统时,它会提示输入密码。我试图通过添加以下传输规范将其包含在 mlia 中:ts=@json:'{"content_protection":"decrypt","content_protection_passphrase":"PASS"}' 但我得到:ERROR -- : unrecognized parameter: content_protection_passphrase = "PASS" 我做错了什么?
【解决方案2】:

这看起来像是CSRF 防御。

你需要提出两个请求和use a cookie jar to store cookies between them

您需要通过 HTML 解析器(例如 pup)运行第一个请求以提取authentity_token。

然后您需要发出第二个请求并使用第一个请求中的数据和 cookie jar。

【讨论】:

  • 所以我会执行第一个请求而不发布任何内容,存储authentity_token,然后执行第二个请求发布数据并添加--cookie?
  • 您需要为 both 请求使用相同的 cookie jar。第一个请求需要是获取表单。第二个请求需要发送到表单提交到的任何位置。
【解决方案3】:

您可以在任何浏览器(开发者模式)中打开调试器来演示html表单并捕获网络请求并将其复制为curl。

目标主机必须存在,因为您需要来自 POST 操作的一些响应。

这是我从我的 chrome 浏览器得到的。

curl 'https://XXXXXXXX.com/aspera/faspex/test/dropbox_submissions'  -X POST \
-H 'Connection: keep-alive'  \
-H 'Cache-Control: max-age=0' -H 'Upgrade-Insecure-Requests: 1' -H 'Origin: null'  \
-H 'Content-Type: application/x-www-form-urlencoded'  \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'  \
-H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3'  \
-H 'Accept-Encoding: gzip, deflate'  \
-H 'Accept-Language: en-US,en;q=0.9,ko;q=0.8,la;q=0.7'  \
--data 'authenticity_token=cU%2FzhZKnbjk90v57Phmdgewq97lKclj63MtzfCHhEqc%3D&dropbox%5Bid%5D=738&passcode=1738d1bc02755019655dd424Xf2717f1c8a7c579&delivery%5Btitle%5D=&file=&delivery%5Bsource_paths_list%5D=' --compressed --insecure

【讨论】:

    猜你喜欢
    • 2019-06-30
    • 1970-01-01
    • 2019-04-24
    • 2013-07-30
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多