Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.01.2011, 09:40   #1
Руслантус
Наркоман самоучка
Форумчанин
 
Аватар для Руслантус
 
Регистрация: 22.07.2007
Сообщений: 276
Печаль Неправильно воспринимаются POST данные

Всем привет.

Что делаю:
С помощью программы, передаю POST запрос в PHP скрипт. Передаваемые данные шифруются с помощью алгоритма Triple-DES и кодируются стандартным методом UrlEncode. PHP скрипт должен вернуть расшифрованные данные, полученные из запроса.

Проблема:
Неверно расшифровываются данные. Точнее, расшифровывается часть данных. Насколько я понял, это происходит из-за того, что переданные данные преобразуются. Хотя, возможно, проблема в другом.

Пример:
Передаваемые данные
Цитата:
\t%xZЌѕЩoхz¤Vљ/ШчZWOћ—9WP|dLsКЇЈ—*’h@“ўКIїЩkтэЬПР Џ›¶Ќ'~&Ђ2~>*Ґ-±”Сў™)\\bЉ{Я*КПEЭа\0mЏд?!FТЗ@їClэµ\nk@>„цмi
А такими они поступают на PHP скрипт. Я выделил зоны изменения.
Цитата:
\t%xZЌѕЩoхz¤Vљ/ШчZWOћ—9WP|dLsКЇЈ—*’h@“ўКIїЩkтэЬПР Џ›¶Ќ\\'~&Ђ2~>*Ґ-±”Сў™)\\\\bЉ{Я*КПEЭа\\0mЏд?!FТЗ@їClэµ\nk@>„цмi
Причём, если я напрямую устанавливаю данные, передаваемые программой в PHP скрипт, то они нормально расшифровываются. И ещё, такой факт. На домашнем сервере, всё работает хорошо (Denwer).

Часть PHP скрипта:
Код:
...
function Decrypt($message, $key, $iv)
{
	$generic = mcrypt_module_open( MCRYPT_TRIPLEDES, '', MCRYPT_MODE_ECB, '' );
		
	if (mcrypt_generic_init( $generic, $key, $iv ) != -1)
	{
		$message = mdecrypt_generic( $generic, $message );
			
		mcrypt_generic_deinit( $generic );
		mcrypt_module_close( $generic );
			
		return $message;
	}
	else
	{
		return "";
	}
}
...
echo Decrypt( $_POST["api"], $key, $iv );
...
Помогите разобраться, я уже замучился...
#include <мозг.h>
Руслантус вне форума Ответить с цитированием
Старый 04.01.2011, 12:00   #2
Руслантус
Наркоман самоучка
Форумчанин
 
Аватар для Руслантус
 
Регистрация: 22.07.2007
Сообщений: 276
По умолчанию

Ещё кое-что заметил. Если передать зашифрованную строку "hi78", то она нормально расшифровывается на сервере. Если передать "hi787", то возвращается неправильный ответ.

Видимо, что-то с кодировкой...
#include <мозг.h>
Руслантус вне форума Ответить с цитированием
Старый 04.01.2011, 12:21   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
кодируются стандартным методом UrlEncode
А зачем? POST ведь просто приклеивает любые передаваемые данные после HTTP заголовка, или я чего-то не понимаю. Это примерно как урленкодить данные перед сохранением на диск, чтобы винчестер не поломался.

В порядке бреда: кодируй данные перед отправкой в base64.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 04.01.2011, 12:44   #4
Руслантус
Наркоман самоучка
Форумчанин
 
Аватар для Руслантус
 
Регистрация: 22.07.2007
Сообщений: 276
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
А зачем? POST ведь просто приклеивает любые передаваемые данные после HTTP заголовка, или я чего-то не понимаю. Это примерно как урленкодить данные перед сохранением на диск, чтобы винчестер не поломался.
Чтобы прикрыть спец. символы. Ведь в шифрованных данных могут попасться символы & и =. Тогда сервер не сможет правильно разобрать запрос.

Цитата:
Сообщение от veniside Посмотреть сообщение
В порядке бреда: кодируй данные перед отправкой в base64.
Помогло! Но после того, как строку в Base64, я обработал ещё и UrlEncode.

Спасибо.
#include <мозг.h>
Руслантус вне форума Ответить с цитированием
Старый 04.01.2011, 13:13   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Сообщение от Руслантус Посмотреть сообщение
Чтобы прикрыть спец. символы.
Стоп. POST запрос выглядит примерно так:

Код:
POST /myform HTTP/1.1
Content-length: 1000

[и тут идут любые бинарные данные размером ровно 1000 байт]
А, всё, дошло Там ещё и несколько переменных может быть... Имхо, если переменная одна, то можно поиграть с Content-Type, вместо "application/x-www-form-urlencoded" заюзать "application/octet-stream".

А изначальная проблема, имхо, крылась в разной настройке "Content-Encoding" или подобного параметра (или его дефолтового значения, если в POST запросе его нет), из-за чего некоторые обратные слэши задвоились.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как данные из формы, переданные методом POST получить в cgi скрипте написанном на паскале GROSS777 PHP 3 28.05.2010 12:14
Не воспринимаются символы конца строки Sam Gold C++ Builder 1 18.05.2010 16:15
Не могу определить до конца данные отправки POST (INDY)) Steklorez Работа с сетью в Delphi 2 26.03.2010 18:20
Че неправильно! HixoH Общие вопросы C/C++ 0 23.12.2009 15:04