Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Perl и форум SMF


Автор: OutlawZ 22.10.2010, 03:32
Привет, столкнулся с проблемой, работаем в системе 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`у что потом отослать в форме уже сгенерированное значение? 

Автор: Jimy 22.10.2010, 09:28
Цитата

Стало ясно что переписывать сей алгоритм вообще нет смысла

Ну а что там переписывать? Там суть алгоритма заключается всего в одной строчке
Код

doForm.hash_passwrd.value = hex_sha1(hex_sha1(doForm.user.value.php_to8bit().php_strtolower() + doForm.passwrd.value.php_to8bit()) + cur_session_id);


А передать в JavaScript можно только если скрипт будет запускаться запросом из браузера.

Автор: OutlawZ 22.10.2010, 14:35
Если не трудно можно пример?

Автор: Jimy 22.10.2010, 16:01
Пример чего?

Автор: OutlawZ 23.10.2010, 01:39
Цитата

А передать в JavaScript можно только если скрипт будет запускаться запросом из браузера. 


Пример сего.

Автор: MaXL 23.10.2010, 05:05
Цитата

как лучше передать данные из CGI скрипта Javasctip`у

что ?
помойму лучше написать на Perl генерацию хэша пароля. код на JavaScript'е у вас есть.
в чём проблема ?

Автор: OutlawZ 23.10.2010, 21:49
Я бы с радостью если понял тока несколько вещей:
Код

<form action="https://server/index.php?action=login2" method="post" accept-charset="UTF-8" name="frmLogin" id="frmLogin" onsubmit="hashLoginPassword(this, '3c136295de545599350428bd23f974d7');">
            <table border="0" cellspacing="0" cellpadding="3" class="tborder" align="center">
                <tr class="catbg">
                    <td>Внимание!</td>
                </tr><tr>
                    <td class="windowbg" style="padding-top: 2ex; padding-bottom: 2ex;">
                        Только зарегистрированные пользователи имеют доступ в этот раздел.<br />
                        Пожалуйста, войдите или <a href="https://server/index.php?action=register">зарегистрируйтесь</a>
                </td>
                </tr><tr class="titlebg">
                    <td><img src="https://server/Themes/coru/images/icons/login_sm.gif" alt="" align="top" /> Войти</td>
                </tr><tr>
                    <td class="windowbg">
                        <table border="0" cellpadding="3" cellspacing="0" align="center">
                            <tr>
                                <td align="right"><b>Имя пользователя:</b></td>
                                <td><input type="text" name="user" size="20" /></td>
                            </tr><tr>
                                <td align="right"><b>Пароль:</b></td>

                                <td><input type="password" name="passwrd" size="20" /></td>

                            </tr><tr>

                                <td align="right"><b>Продолжительность сессии (в минутах):</b></td>

                                <td><input type="text" name="cookielength" size="4" maxlength="4" value="60" /></td>

                            </tr><tr>

                                <td align="right"><b>Запомнить:</b></td>

                                <td><input type="checkbox" name="cookieneverexp" class="check" onclick="this.form.cookielength.disabled = this.checked;" /></td>

                            </tr><tr>

                                <td align="center" colspan="2"><input type="submit" value="Войти" style="margin-top: 2ex;" /></td>

                            </tr><tr>

                                <td align="center" colspan="2" class="smalltext"><a href="https://server/index.php?action=reminder">Забыли пароль?</a><br /><br /></td>

                            </tr>

                        </table>

                    </td>

                </tr>

            </table>



            <input type="hidden" name="hash_passwrd" value="" />

        </form>



Дело в том что когда функция генерить значение она получает значение PHPSID который выдает сервер или скрипт при коннекте:
Cookie: PHPSESSID=ad9db49f1d1fba5c4df99798535f57c5 это значение попадает функцию что видно в форме: hashLoginPassword(this, 'ad9db49f1d1fba5c4df99798535f57c5'). С этим проблем нет, это значение получить не проблем, вот не как не помогу понять алгоритм генерации хеша, для передачи его в дальний путь:

Код

doForm.hash_passwrd.value = hex_sha1(hex_sha1(doForm.user.value.php_to8bit().php_strtolower() + doForm.passwrd.value.php_to8bit()) + cur_session_id);


но что вот это php_to8bit().php_strtolower()  я не как понять не могу, все исходники перерыл не как не могу найти эти функции. и следовательно я не знаю истинные значения используются для кодирования хеша. В этом основная проблема.

Автор: OutlawZ 7.4.2011, 01:33
Нашел в чем проблема, не установил просто модуль SSL для работы с https.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)