Привет, столкнулся с проблемой, работаем в системе SMF форум, дали задачу написать скрипт на перл что бы он автоматизировался в системе но этого у меня не получается. Сначала катал запросы к форме авторизации такого вида:
| Код | use LWP::UserAgent; #Получаем данные с страницы
my ($user_a, $request, $result );
$user_a = LWP::UserAgent->new(); $request = HTTP::Request->new(POST => 'http://site/index.php?action=login2'); $request->content('user=login&passwrd=password&cookielength=60'); $result = $user_a->request($request); if ($result->is_success) { print $result->content; }
|
Автоматизироваться не получилось, потом решил посмотреть какой HTTP запрос отравляется:
| Код | POST http://cyber-police-community.ru/index.php?action=login2 HTTP/1.1 Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* Referer: http://cyber-police-community.ru/index.php?action=login2 Accept-Language: ru User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Host: cyber-police-community.ru Content-Length: 97 Proxy-Connection: Keep-Alive Pragma: no-cache Cookie: PHPSESSID=ad9db49f1d1fba5c4df99798535f57c5
user=login&passwrd=*********&cookielength=60&hash_passwrd=146a3d9db139d60d6b1ffee27795224b86809b06
|
Тут добавляется еще один параметр hash_passwrd посмотрев в исходник форума видно что тут еще работает Javascript нашел в нем функцию которая используется для получения хеша:
| Код | function hashLoginPassword(doForm, cur_session_id) { // Compatibility. if (cur_session_id == null) cur_session_id = smf_session_id;
if (typeof(hex_sha1) == "undefined") return; // Are they using an email address? if (doForm.user.value.indexOf("@") != -1) return;
// Unless the browser is Opera, the password will not save properly. if (typeof(window.opera) == "undefined") doForm.passwrd.autocomplete = "off"; window.open(document.write( doForm.hash_passwrd.value = hex_sha1(hex_sha1(doForm.user.value.php_to8bit().php_strtolower() + doForm.passwrd.value.php_to8bit()) + cur_session_id);
// It looks nicer to fill it with asterisks, but Firefox will try to save that. if (navigator.userAgent.indexOf("Firefox/") != -1) doForm.passwrd.value = ""; else doForm.passwrd.value = doForm.passwrd.value.replace(/./g, "*"); }
|
Видно что кодируется все sh1 два раза во втором годирование прибавляется лониг пароль и сессия. Стало ясно что переписывать сей алгоритм вообще нет смысла а лучше использовать тот же javascript только вот проблема как лучше передать данные из CGI скрипта Javasctip`у что потом отослать в форме уже сгенерированное значение? |