LINUX.ORG.RU

Секрет POST запроса http


0

1

Здравствуйте! Подскажите пожалуйста как быть? В http совсем не силён! Задача стоит так. Есть 3g wi-fi модем huawei e355, который нужно удаленно ребутить хотя бы раз в сутки. Идея в следующем. У роутера есть админка, которая находится по адресу 192.168.1.1. В этой админке есть кнопка «Перезагрузить». Так вот события, возникающие по нажатию кнопки обрабатываются javascript, который в свою очередь производит не что иное, как POST запрос на сервер. Программы типа firebug, fiddler, http analyzer говорят, что в момент перед перезагрузкой модема из браузера происходит обращение по URL http://192.168.1.1/api/device/control. При этом ответ сервера <?xml version=«1.0» encoding=«UTF-8»?><response>OK</response>. Если скопировать данный URL и перейти по нему в браузере, либо же нажать Reply (т.е. попытаться его повторить) в программе fiddler, то в качестве ответа получим ошибку с кодом 100002. После недолгих размышлений и одного эксперимента стало ясно, что скорее всего не хватает логина и пароля, т.к. попытка выполнить перезагрузку (т.е. тот самый javascript) после нажатии кнопки «log out» в интерфейсе модема приводит к тому, что сервер возвращает точно ту же ошибку 100002 и перезагрузка не происходит. Тем не менее http analyzer пишет, что post data содержит лишь это - «1.0» encoding=«UTF-8»?><request><Control>1</Control></request>.

Помогите разобраться пожалуйста как правильно сформировать http запрос, чтобы можно было программно имитировать его!!! (Целевой ЯП - Java под Anroid, но это я уже сам разберусь). Спасибо!

Если скопировать данный URL и перейти по нему в браузере

Пойдет GET запрос

Тем не менее http analyzer пишет, что post data содержит лишь это - «1.0» encoding=«UTF-8»?><request><Control>1</Control></request>.

COOKIE

kiotoze ★★★★
()

Помимо самого URL надо знать также параметры, которые передаются с запросом. Очевидно, что адрес /api/device/control может обрабатывать разные команды. Однако предварительно надо будет на модем залогиниться, чтобы он вернул куки аутентификации.

static_lab ★★★★★
()

У роутера есть админка, которая находится по адресу 192.168.1.1

1. скачать HTML код этой админки wget'ом, скорее всего там форма логин/пароль и некий ID

2. отправить ID, логин и пароль вторым wget'ом и им же скачать ответ, также принять куку

3. проверить ответ, узнать, пустили нас, или нет. Если пустили:

4. отправить куку и форму третьим wget'ом, симулируя нажатие на нужную кнопку, принять ответ этим же wget'ом

5. проверить ответ, дабы узнать, нажалась-ли кнопка.

emulek
()
Ответ на: комментарий от emulek

куку

А если разработчик веб-морды — такая же хитрожопая скотина, как я, то будет не кука, а значение, сохраненное в localStorage =D

Eddy_Em ☆☆☆☆☆
()

Firefox -> Copy as cURL

Deleted
()
Ответ на: комментарий от kiotoze

Спасибо! Посмотрите пожалуйста здесь https://dl.dropboxusercontent.com/u/65360035/screen.zip анализ запроса, который происходит во время перезагрузки в программе http analyzer.

Создаю POST запрос в Advanced POST Client (расширение для хрома), указываю в заголовке в частности Cookie: _authorized=admin, но запрос возвращает ошибку 100003

furevor
() автор топика

Залогинился в админке, перешёл в раздел «Перезагрузка», нажал кнопку «Перезагрузка» затем «Да» в форме подтверждения, поймал после этого в fiddler запрос http://192.168.1.1/api/device/control. Дождался пока роутер поднимется, нажал в fiddler кнопку Replay на данном запросе, но запрос вернулся с ошибкой. Тогда я снова зашёл в админку через браузер, залогинился и вернулся в fiddler. Нажал в fiddler снова кнопку Replay и запрос вернулся с ответом OK и роутер перезагрузился! Подскажите как всё это дело вытащить? Ответ уже где-то рядом! :D

furevor
() автор топика
Ответ на: комментарий от PolarFox

нет у него telnet, а по ssh .. по моему не проще, т.к. он перестаёт отдавать инет в произвольный момент. Кстати, попробовал повторить в fiddler запрос /api/user/login, а затем api/device/control и модем перезагрузился. Похоже дело близится к развязке.

furevor
() автор топика
Ответ на: комментарий от furevor

Скорее всего сервер ждет запрос в форме ajax, поэтому тужно дополнительно передать заголовок X-Requested-With: XMLHttpRequest. В идеале лучше всего передать заголовки в точности как на Scr144.png ну и методом POST естественно

kiotoze ★★★★
()
Ответ на: комментарий от furevor

Только сейчас заметил

Целевой ЯП - Java под Anroid

Андроид всё же отчасти линукс, так что заставить работать решение с ssh можно…

Кстати можно поколдовать над самим роутером, придумав на него какой-нибудь скрипт, раз в минуту пингующий гугл и ребутящий роутер при отсутствии пинга. Но это если роутер такое умеет.

Ну а так да, из сраной ведроидовской жабки действительно проще пост-запрос послать.

PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

По моему этот китайский несчастный роутер (huawei) настолько урезан, что никакой скрипт на него не повешаешь, тоже думал об этом, так что надо решать это дело POST запросом. В общем не знаю я как это всё работает, отсюда и проблемы. Знаю только, что если из того же fiddler сначала повторить запрос на login, а потом тут же выполнить запрос control (ребут), то модем перезагружается! Что такое он отправляет в ответ и откуда fiddler это потом берёт, что после логина запрос на перезагрузку проходит?

furevor
() автор топика

Всем спасибо за ответ! Решение было найдено. Перед тем как выполнять запрос http://192.168.1.1/api/device/control для перезагрузки, необходимо было выполнить запрос http://192.168.1.1/api/user/login с соответствующими параметрами. Код для андроида и подробности позже.

furevor
() автор топика
Ответ на: комментарий от furevor

Спасибо! Всё получилось. 3g wi-fi modem huawei e355 с андроид устройства путем POST запроса перезагружен! Если не вдаваться в подробности того, что http запрос не выполняется из основного потока (если кто не знающий этого, будет читать форум), а так же опустить блоки try/catch, то код авторизации выглядит примерно так:

public void makeSecondHttpPOSTRequest() { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://192.168.1.1/api/user/login");

String xmlString = «<?xml version=\„1.0\“ encoding=\„UTF-8\“?><request><Username>admin</Username><Password>eW04NWoyNzZm</Password></request>»; InputStream inputStream = new ByteArrayInputStream(xmlString.getBytes());//init your own inputstream InputStreamEntity inputStreamEntity = new InputStreamEntity(inputStream, xmlString.getBytes().length); httppost.setEntity(inputStreamEntity);

HttpResponse response = httpclient.execute(httppost); }

Никакие заголовки задавать при этом не требуется. (по крайней мере для e355) Однако стоит заметить, что пароль здесь передаётся совсем не тот, который бы я вводил в форму логина. Я ещё не посмотрел, но похоже там какой-то javascript этот самый пароль кодирует. Догадываюсь конечно как, но надо уточнить..

Далее запрос на перезагрузку. Код выглядит так же за исключением того, что URL меняется на "http://192.168.1.1/api/device/control", а xml тело запроса на String xmlString = «<?xml version=\„1.0\“ encoding=\„UTF-8\“?><request><Control>1</Control></request>»;

Собственно на этом всё. Если кому вдруг это будет нужно, но не понятно, стучите в skype: skyline0034

furevor
() автор топика
Ответ на: комментарий от Eddy_Em

А если разработчик веб-морды — такая же хитрожопая скотина, как я, то будет не кука, а значение, сохраненное в localStorage =D

с этого место поподробнее: кука нужна для того, что бы рутер знал, что «на кнопку нажал» тот же самый браузер, который отправил логин/пароль. Естественно можно каждый раз выдавать(роутеру) скрытое поле с каким-то ID, а потом проверять верность вернувшегося ID. Но это некошерно.

emulek
()
Ответ на: комментарий от furevor

Создаю POST запрос в Advanced POST Client (расширение для хрома), указываю в заголовке в частности Cookie: _authorized=admin, но запрос возвращает ошибку 100003

куку тебе нужно сначала получить, а потом полученную выдавать. Она имеет обычно вид вроде этого: ce9ff5ffb27dfb5949a14c03e157715f2d9521bb.

emulek
()
Ответ на: комментарий от PolarFox

придумав на него какой-нибудь скрипт, раз в минуту пингующий гугл и ребутящий роутер при отсутствии пинга. Но это если роутер такое умеет.

уметь-то он может и умеет, а куда этот скрипт засунуть? Там обычно только RAM и EPROM. Причём вся ФС там вроде как распаковывается с образа при загрузке. Предлагаешь расковырять, обратно заковырять, и перепрошить?

emulek
()
Ответ на: комментарий от furevor

huawei e355

Собственно на этом всё.

спасибо. Я это говно никогда не куплю.

emulek
()

можешь повторить это в хроме, потом нажать правой кнопкой на запрос в developer tools, и выбрать Copy as CURL. Даже подделывать ничего не надо, автоматическая подделывалка.

thesame ★★★★
()
Ответ на: комментарий от emulek

Я не пользуюсь куками: всю нужную информацию храню в localstorage. Это значительно удобней, т.к. с куками постоянно косяки какие-то: то они внезапно заканчивают срок действия, то «пропадают» ☺

это некошерно

Очень даже кошерно: какая, нафиг, разница, выдашь ты куку с этим ID, или же выдашь ID для сохранения в localStorage? Потом через вебсокет идентификатор передал, либо к POST-запросу его прислюнил — вуаля!

P.S. В случае ID с локальным хранилищем ты передаешь только имя ключа (пару-тройку байт) и этот ID. В случае с кукой ты еще кучу ненужной информации передаешь.

Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 1)
Ответ на: комментарий от furevor

Мать моя женщина! Эта хрень передает пароль в http? Мде. Что за чудаки на букву "М" разработали этот идиотизм?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Я не пользуюсь куками: всю нужную информацию храню в localstorage. Это значительно удобней, т.к. с куками постоянно косяки какие-то: то они внезапно заканчивают срок действия, то «пропадают» ☺

угу. Полно юзеров, которые обожают отключать куки «для защиты от хакеров». LocalStorage никто не отключает.

В случае с кукой ты еще кучу ненужной информации передаешь.

зачем?

emulek
()
Ответ на: комментарий от emulek

зачем?

Посмотри на тело куки! Там еще куча лишних байт. Да и просто механизм обработки кук не так удобен, как механизм обработки строки вида «параметр=значение».

Правда, с localstorage тоже баги есть. Я намедни наткнулся, когда пытался веб-морду одну заставить запоминать текущий источник видео: на компьютере, где сервер запущен, все работало; а на другом компьютере огнелис матюкался. Погуглив, обнаружил, что это не мой баг, а баг огнелиса определенных версий.

Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

куча лишних байт.

сколько это в %% от размера страницы с кучей говнокнопочек и быдлофреймов?

Да и просто механизм обработки кук не так удобен, как механизм обработки строки вида «параметр=значение».

всё равно сервер должен помнить логин/пароль юзера. Почему-бы ему заодно сотню байт настроек этого юзера не запомнить?

Погуглив, обнаружил, что это не мой баг, а баг огнелиса

вот.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.