【问题标题】:How to use WWW::Mechanize to submit a form which isn't there in HTML?如何使用 WWW::Mechanize 提交 HTML 中不存在的表单?
【发布时间】:2023-03-12 17:48:01
【问题描述】:

我正在尝试在 WWW::Mechanize 中编写一个脚本,该脚本将在哈德逊建立一份工作。脚本是这样的:

$mech->post("$hudson_url/view/All/job/$job_name/build?delay=0sec", \%job_arguments);

问题在于 Hudson 日志抱怨它期望表单提交。以下是从 Hudson 日志中提取的:

Caused by: java.lang.Error: This page expects a form submission
    at org.kohsuke.stapler.RequestImpl.getSubmittedForm(RequestImpl.java:769)
    at hudson.model.ParametersDefinitionProperty._doBuild(ParametersDefinitionProperty.java:116)
    at hudson.model.AbstractProject.doBuild(AbstractProject.java:1531)
    ... 69 more

问题是,Hudson 中的构建是参数化的,因此 Hudson 显然是使用 JavaScript 生成表单。最终,Hudson 将调用此 URL。我怎样才能提出此请求,以便 Hudson 认为我在发布表单?


更新:我有 Chrome 中显示的请求数据。这是有效的:

Request URL:<url>/hudson/view/All/job/ReleaseThis/build?delay=0sec
Request Method:POST
Status Code:302 Moved Temporarily
Request Headers
Accept:application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:935
Content-Type:application/x-www-form-urlencoded
Cookie:screenResolution=1920x1080; JSESSIONID=B3F99F6C376318AB6331AE6F27917D52; screenResolution=1920x1080; __utmz=250097027.1291302888.1.1.utmcsr=...|utmccn=(referral)|utmcmd=referral|utmcct=/sig/Home.action; __utma=250097027.1666115034.1291302888.1291302888.1291302888.1
Host:<hudson_url>
Origin:<huson_url>
Referer:https://<hudson_url>/hudson/view/All/job/ReleaseThis/build?delay=0sec
User-Agent:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.84 Safari/534.13
Query String Parameters
delay:0sec
Form Data
name:URL
value:https://<url>
value:1.12-SNAPSHOT
name:RELEASE_VERSION
value:1.12-TEST16
name:UPDATE_MASTER_POM
name:PROPERTY_NAME
value:
name:DEV_VERSION
value:
name:STABLE_VERSION
value:
json:{"parameter": [{"name": "URL", "value": <url>}, {"name": "SNAPSHOT_VERSION", "value": "1.12-SNAPSHOT"}, {"name": "RELEASE_VERSION", "value": "1.12-TEST16"}, {"name": "UPDATE_MASTER_POM", "value": false}, {"name": "PROPERTY_NAME", "value": ""}, {"name": "DEV_VERSION", "value": ""}, {"name": "STABLE_VERSION", "value": ""}]}
Submit:Build
Response Headers
Connection:close
Content-Length:0
Content-Type:text/plain; charset=UTF-8
Date:Fri, 04 Feb 2011 13:33:27 GMT
Location:https://<hudson.url>/hudson/view/All/job/ReleaseThis/
Server:Apache-Coyote/1.1
Via:1.1 <hudson.url>:8890 (Apache/2.2.3)

【问题讨论】:

  • 尝试获取流量的 tcpdump,然后您可以识别数据以哪种格式发送。

标签: perl post hudson mechanize


【解决方案1】:

有两种可能,一种是有一个javascript生成的随机字符串作为字段之一,以防止CSRF攻击,以及bot自动提交。在这种情况下,您需要反转 javascript 算法来解析和发布字符串,或者使用 WWW::Scripter,但是我还没有测试过。

其次,我相信更有可能的选项是脚本检查前向引用者,在这种情况下,只需通过编辑标题设置引用者,你可能会很好。

还要注意的是,您在浏览器和 perl 脚本请求中具有完全相同的标头和 cookie;因此,您可以先get 带有表单的页面来设置cookie,或者在脚本中自己设置它们。

没有一个措施是绕不过去的,要使用脚本,你只需要通过测试找到使用哪一个...

【讨论】:

  • 我使用了引用标头并将参数之间的转换编写为 json(hudson 似乎需要)。有效。谢谢!
猜你喜欢
  • 1970-01-01
  • 2010-12-16
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
  • 2017-04-21
  • 2012-01-24
  • 1970-01-01
相关资源
最近更新 更多