Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Передача переменных через URLVariables (http://www.flasher.ru/forum/showthread.php?t=168675)

CaribbeanLegend 23.09.2011 11:30

Передача переменных через URLVariables
 
Приветствую всех.

Ситуация такова:
Есть клиент-серверная игрушка, на сервере - PHP.
Логика обмена данными между ними такая:
Клиент отправляет запрос, к которому дописывается еще один параметр - сигнатура запроса, sign (md5-хэш запроса).
На сервере выбираются все параметры, кроме sign, вычисляется их md5-хэш и сравнивается с параметром sign, пришедший с клиента. Если идентичны - все гуд, работаем, а если нет - отсылаем.

И вот тут появляется проблема: на Флаше, при добавлении параметров к запросу через URLVariables, они почему-то случайным образом сортируются. А их md5 хэш вычисляется по строке параметров, которая была образована до разбивания ее в объект URLVariables.

Поясню.

Например, у меня есть вот такой запрос:
commandID=loadData&userId=" + Main.userId + "&mode=" + Main.userMode

Код отправки запроса:
Код AS3:

/**
 * Метод выполняет отправку запроса на сервер.
 * @param _query Строка запроса.
 * @param _completeEventHandler Обработчик события успешного выполнения запроса.
 * @param _ioErrorEventHandler Обработчик события появления ошибки при выполнении запроса.
 */

public static function sendQuery(_query:String, _completeEventHandler:Function = null, _ioErrorEventHandler:Function = null):void
{
        var urlLoader:URLLoader = new URLLoader();
        var variables:URLVariables = new URLVariables();
        var request:URLRequest = new URLRequest(sScriptURL);
        var paramPairs:Array = _query.split(/[&=]/);
 
        for(var i:int = 0; i < paramPairs.length; i += 2)
        {
                variables[paramPairs[i]] = paramPairs[i + 1];
        }
 
        if(bUseSignature)
        {
                variables["sign"] = MD5.encrypt(_query);
        }
 
        request.data = variables;
        request.method = URLRequestMethod.POST;
 
        if(_completeEventHandler != null)
        {
                urlLoader.addEventListener(Event.COMPLETE, _completeEventHandler, false, 0, true);
                urlLoader.addEventListener(Event.COMPLETE, onPHPResponse, false, 0, true);
        }
 
        if(_ioErrorEventHandler != null)
        {
                urlLoader.addEventListener(IOErrorEvent.IO_ERROR, _ioErrorEventHandler, false, 0, true);
                urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onPHPResponseError, false, 0, true);
        }
 
        urlLoader.dataFormat = URLLoaderDataFormat.TEXT;
 
        urlLoader.load(request);
}

И код проверки подписи на сервере:
PHP код:

/**
 * Функция выполняет проверку подписи запроса.
 */
function checkSignature()
{
    
$queryStr "";
    
    foreach(
$_POST as $key => $value)
    {
        if(
$key == "sign") continue;
    
        
$queryStr .= "&$key=$value";
    }
    
    
$queryStr substr($queryStr1);
    
    return 
strcmp($_POST['sign'], md5($queryStr QUERY_ADDITIONAL_SIGN_PART)) == 0;


Соответственно, подписи запроса совпадают только в том случае, если параметры после добавления в объект URLVariables идут по очереди так-же, как и в самой строке запроса.

Отсюда вопрос - как от этой произвольной сортировки в объектах избавиться?

Заранее спасибо за ответы :)

Inet_PC 23.09.2011 12:10

Код AS3:

sort()

перед вычислением MD5? И в пхп тоже

CaribbeanLegend 23.09.2011 12:36

А что там сортировать то? Это не массив ведь, а объект.

На клиенте, по крайней мере.

Inet_PC 23.09.2011 12:50

Ну так кто вам мешает из объекта массив сделать?
Код AS3:

var sorted: Array = [];
 
for(var i:int = 0; i < paramPairs.length; i += 2)
{
        variables[paramPairs[i]] = paramPairs[i + 1];
        sorted.push(paramPairs[i] + "=" + paramPairs[i + 1]);
}
sorted.sort();
var signature: String = '';
for (key in sorted)
{
        signature += sorted[key];
}
signature = MD5.encrypt(signature);

Как то так, на пхп аналогично

CaribbeanLegend 23.09.2011 13:31

Да, помогло. Мерси :)

Inet_PC 23.09.2011 14:25

Неначем)


Часовой пояс GMT +4, время: 19:04.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.