Invoke-Webrequest не отправляет форму авторизации POST - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь получить некоторую информацию на локальной веб-странице, для доступа к которой требуется логин.

Я могу бежать

$response = Invoke-WebRequest "http://web.com/admin/launch?script=rh&template=dashboard" -SessionVariable rb -UserAgent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'

$response содержит правильную информацию, включая одну форму под названием login_form, которую мне нужно использовать.

Тогда я пишу:

$response.Forms[0].Fields.user_id = 'admin'
$response.Forms[0].Fields.password= 'pass'
$response.Forms[0].Fields

Key       Value  
---       -----  
d_user_id user_id
t_user_id string 
c_user_id string 
e_user_id true   
user_id   admin  
password  pass  

Я ожидаю, что следующая команда вернет данные страницы, на которую я перенаправлен после входа в систему.

Invoke-WebRequest $('http://web.com/admin/' + $response.Forms[0].Action) -WebSession $rb -Body $response.Forms[0].Fields -Method POST -contentType "application/x-www-form-urlencoded"

Однако это просто возвращает предыдущую страницу, включая объект login_form. Он идентичен $response, хотя запрос кажется совершенно другим.

Я думаю, что эта проблема возникает из-за того же URL-адреса, используемого для каждой страницы, с разными строковыми параметрами запроса (например, script=rh&template=login&action=login), возвращающими разные страницы. Однако я включаю эти строки в свой параметр -URI в форме строки или свойства Action. Поэтому я не уверен, какой другой метод я бы использовал, чтобы вернуть правильную страницу, если мой запрос POST вообще работает.

Я полностью застрял здесь с отсутствием какой-либо ошибки для отработки. Я не думаю, что допустил ошибку с запросом, так как провел много времени, настраивая параметры (другой синтаксис для определения полей и т. Д.), Что не имело никакого значения.

Файл Chrome HAR: Загрузить с Google Диска

1 Ответ

0 голосов
/ 23 мая 2018

Я наконец понял это. Были дополнительные поля, необходимые для формы. Был запущен JS для переименования полей в форме, и, таким образом, когда я получал объект входа, я заполнял «неправильные» поля, так как Invoke-Webrequest, конечно, не запускает JS, когда я публикую форму. После долгой игры с запросом в Fiddler я в конечном итоге заметил, что успешный вход в систему был результатом этих полей, которые были названы совсем немного иначе. Вот как это выглядело в итоге:

$response = Invoke-WebRequest "http://web.com/admin/launch?script=rh&template=login" -SessionVariable x -UserAgent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'

$response.Forms[0].Fields.Add('f_user_id','admin')
$response.Forms[0].Fields.Add('f_password','')

$null = Invoke-WebRequest $('http://web.com/admin/' + $response.Forms[0].Action) -WebSession $x -Body $response.Forms[0].Fields -Method POST -contentType "application/x-www-form-urlencoded"

Invoke-WebRequest 'http://web.com/admin/launch?script=rh&template=dashboard' -WebSession $x
...