Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 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 идут по очереди так-же, как и в самой строке запроса.

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

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

Старый 23.09.2011, 12:10
Inet_PC вне форума Посмотреть профиль Отправить личное сообщение для Inet_PC Посетить домашнюю страницу Inet_PC Найти все сообщения от Inet_PC
  № 2  
Ответить с цитированием
Inet_PC
 
Аватар для Inet_PC

Регистрация: Feb 2009
Адрес: Гы...поди, найди!
Сообщений: 853
Записей в блоге: 1
Код AS3:
sort()
перед вычислением MD5? И в пхп тоже
__________________
http://www.chessmax.ru

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

Регистрация: Jul 2010
Сообщений: 24
А что там сортировать то? Это не массив ведь, а объект.

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


Последний раз редактировалось CaribbeanLegend; 23.09.2011 в 12:41.
Старый 23.09.2011, 12:50
Inet_PC вне форума Посмотреть профиль Отправить личное сообщение для Inet_PC Посетить домашнюю страницу Inet_PC Найти все сообщения от Inet_PC
  № 4  
Ответить с цитированием
Inet_PC
 
Аватар для Inet_PC

Регистрация: Feb 2009
Адрес: Гы...поди, найди!
Сообщений: 853
Записей в блоге: 1
Ну так кто вам мешает из объекта массив сделать?
Код 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);
Как то так, на пхп аналогично
__________________
http://www.chessmax.ru

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

Регистрация: Jul 2010
Сообщений: 24
Да, помогло. Мерси

Старый 23.09.2011, 14:25
Inet_PC вне форума Посмотреть профиль Отправить личное сообщение для Inet_PC Посетить домашнюю страницу Inet_PC Найти все сообщения от Inet_PC
  № 6  
Ответить с цитированием
Inet_PC
 
Аватар для Inet_PC

Регистрация: Feb 2009
Адрес: Гы...поди, найди!
Сообщений: 853
Записей в блоге: 1
Неначем)
__________________
http://www.chessmax.ru

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:36.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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