Показать сообщение отдельно
Старый 23.09.2011, 11:30
CaribbeanLegend вне форума Посмотреть профиль Отправить личное сообщение для CaribbeanLegend Найти все сообщения от CaribbeanLegend
  № 1  
Ответить с цитированием
CaribbeanLegend
 
Аватар для CaribbeanLegend

Регистрация: Jul 2010
Сообщений: 24
По умолчанию Передача переменных через 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 идут по очереди так-же, как и в самой строке запроса.

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

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