3

如果一直在使用下面的命令行来查询简单的 Web 表单,以识别制作后续表单 POST 所需的所有输入字段。但是,我刚刚遇到了一个相对简单的 Web 表单,它有两个输入字段,以下命令无法识别:

Invoke-WebRequest 'http://URI.com/index.aspx' -WebSession $Save | 
select -ExpandProperty inputfields | select name, value

. .

在下面的 HTML 源代码示例中,上面的命令将识别具有“输入名称”的所有内容(如下面的 html 所示);但是,不是其他输入类型;例如,“选择”、“文本区域”。我想知道可以识别以下 HTML 源示例中显示的所有输入字段类型的“the”命令行;以及通过 Powershell Invoke-WebRequest 发布表单所需的任何其他不可预见的输入类型。

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。有人可以确认我可以简单地发布我第一次开始网络会话时收到的相同的 VIEWSTATE 和 EVENTVALIDATION 值吗?当网络会话开始时,它们很容易存储在变量中。所以,希望当我去 POST 时,这些值可以保持原样。

编辑:对于那些建议提琴手的人。我已经使用该工具来获取 POST 的字段名称。 我特别想通过命令行通过类似于以下解决方案的方式获取此信息(不幸的是,正则表达式不正确,但对于熟悉正则表达式的人来说,我会知道我正在尝试做什么:

$r.RawContent| sls -Pattern "(\<(input|select|textarea) name\=[""'])(?:(?=(\\?))\2.)*?\1" -allmatches | %{$_.matches} | %{$_.value}
4

1 回答 1

0

select和area根据规范text不是输入字段。

对于您正在做的事情,我建议您获取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"}

只需将字段附加到此哈希表即可。如果字段名称包含 a$您必须在名称周围加上单引号,否则不需要引号,例如-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)"}
于 2013-11-14T05:23:40.607 回答