如果使用以下命令行来查询简单的Web表单,以识别进行后续表单POST所需的所有输入字段。但是,我刚刚遇到一个相对简单的Web表单,它有两个输入字段,这些字段不能通过以下命令识别:
Invoke-WebRequest 'http://URI.com/index.aspx' -WebSession $Save |
select -ExpandProperty inputfields | select name, value
。
在下面的HTML源代码示例中,上面的命令将标识具有“输入名称”的所有内容(在下面的html中显示);但是,不是其他输入类型;例如,“选择”,“textarea”。我想知道“the”命令行,它可以识别以下HTML源代码示例中显示的 ALL 输入字段类型;以及通过Powershell Invoke-WebRequest POST表单所需的任何其他无法预料的输入类型。
HTML来源:
..align="right" style="white-space:nowrap;"><input name="MainPage$LastName"..
..align="right" style="white-space:nowrap;"><input name="MainPage$email"..
..align="right" style="white-space:nowrap;"><input name="MainPage$phone"..
..align="right" style="white-space:nowrap;"><select name="MainPage$CountryDropDownList"..
..align="right" style="white-space:nowrap;"><input name="MainPage$Description"..
..align="right" style="white-space:nowrap;"><textarea name="MainPage$DescribeHere"..
。
PS:我应该在POST时使用上面的Invoke-WebRequest命令行中返回的名字,还是在下面的命令行中返回的名字?因为,他们是不同的。
$r.Forms[0] | $form.fields
编辑:上面的Invoke-WebRequest的结果是(下面)。如您所见, * MainPage_CountryDropDownList * 和 * MainPage_DescribeHere * 在以下内容中缺失:
Key Value
--- -----
__VIEWSTATE /wEPDwULLTE5OT
__EVENTVALIDATION /wEWEALtsrvJAgLkmtI29k...
MainPage__FirstName Craig
MainPage__LastName Smith
MainPage__email CraigSMith@gmail.com
MainPage__phone
MainPage__Project
MainPage__Submit Submit
编辑:之前我从未处理过VIEWSTATE和EVENTVALIDATION。有人可以确认我可以简单地发布我在第一次开始使用websession时收到的相同VIEWSTATE和EVENTVALIDATION值吗?当websession开始时,它们很容易存储在变量中。所以,当我去POST时,希望值可以保持原样。
编辑:对于那些暗示Fiddler的人。我已经使用该工具获取POST的字段名称。我想通过命令行通过以下解决方案获取此信息(不幸的是,正则表达式不正确,但对于知道正则表达式的人我会知道我在做什么:
$r.RawContent| sls -Pattern "(\<(input|select|textarea) name\=[""'])(?:(?=(\\?))\2.)*?\1" -allmatches | %{$_.matches} | %{$_.value}
答案 0 :(得分:0)
select
和text
区域不是输入字段according to the spec。
对于您正在做的事情,我建议您获取Fiddler,启动它并监控您在浏览器中手动执行的POST。提交表单后,转到Fiddler找到会话并查看原始请求。如果它是一个帖子,它将有一个看起来像这样的主体:
usrname=keith&comment=some+pig.
将该信息传递给您传递给Invoke-WebRequest -Body参数的主体,例如:
$wr = Invoke-WebRequest http://URI.com/index.aspx -WebSession $Save -Method Post `
-Body @{'MainPage$CountryDropDownList'="United States";'MainPage$DescribeHere'="some text"}
只需将字段附加到此哈希表即可。如果字段名称包含$
,则必须在名称周围加上单引号,否则不需要引号,例如-Body @{username="john";age="42"}
。
这是我们提供的body
字符串,用于发布到NetGear交换机以启用/禁用端口:
$portStateBody = "unit_no=1&java_port=&inputBox_interface1=&portDesc=&adminMode=${PortState}&physicalMode=Auto&auto_power_down=Disable&short_cable=Disable&linkTrap=Enable&frameSize=1518&CBox_1=checkbox&inputBox_interface2=&submt=16&cncel=&err_flag=0&err_msg=&selectedPorts=g${PortNumber}%3B&multiple_ports=1"
请注意PowerShell变量${PortState}
和${PortNumber}
。这个文本实际上是从Fiddler的原始请求选项卡中复制/粘贴的,然后我在需要的地方替换了之前提到的PowerShell。
如果您真的想要对这些元素的原始HTML进行正则表达式,请尝试以下方法:
sls -inp $wr.RawContent -pattern '(?is)<(input|select|textarea)\s+.*?(?:id|name)\s*=\s*"([^"]+)"' -AllMatches | Foreach {$_.Matches} | Foreach {"Element: $($_.Groups[1].value) key: $($_.Groups[2].value)"}