6.1. Использование контрольных подписей

Для обеспечения безопасной передачи данных между Вашим сайтом и опросами Simpoll API предлагает механизм контрольных подписей.

Контрольная подпись — это MD5-хэш от строки, составленной из перечисления передаваемых параметров. Для обеспечения секретности перед хэшированием добавляется «соль» — секретный ключ, задаваемый в параметрах опроса на вкладке «API». Поскольку ключ известен только Вам и Simpoll — злоумышленник не сможет подделать подпись, даже зная алгоритм ее создания.

Для использования контрольных подписей должна быть включена соответствующая опция в параметрах опроса, на вкладке «API».

6.2. Подпись параметров передаваемых опросу

В разделе 5 был приведен пример кода, передающего параметры опросу через скрытое поле. Поскольку содержимое этого поля доступно для посетителя, он может подделать страницу изменив передаваемые параметры в этом поле. Для защиты от этого используем контрольную подпись.

Подпись представляет из себя MD5-хэш от строки, состоящий из секретного ключа и значений всех передаваемых параметров, разделенных двоеточием:


					MD5 ( ключ:параметр1:параметр2 )

				

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

После формирования подпись добавляется к общему списку как обычный параметр, с названием sig.

Пример передачи параметров опросу (с контрольной подписью):


					<?php

						// Ключ контрольной подписи опроса
						// задается в параметрах опроса на вкладке "API"
						$survey_secret_key = 'q1w2e3r4';

						// Массив параметров, которые нужно будет передать
						// нашему сайту после прохождения опроса.
						// Может формироваться динамически, при необходимости.
						$params_arr = array(
							'user_id' => 123,
							'user_login' => 'anonymous'
						);

						// Формируем контрольную подпись для массива параметров
						$signature = md5( $survey_secret_key . ':' . implode(':', $params_arr) );

						// Добавляем контрольную подпись к списку параметров
						$params_arr['sig'] = $signature;

						// Формируем URL-кодированную строку запроса
						$params_str = http_build_query($params_arr);

					?>

					<!-- Формируем поле со строкой запроса -->
					<input type="hidden" id="simpoll_params" value="<?php echo $params_str; ?>" />

					<!-- Подключаем опрос -->
					<script type="text/javascript" src="http://simpoll.ru/embed/framejs/aa7ca07e"></script>

				

Теперь, если пользователь изменит любой из параметров то подпись станет невалидной и Simpoll не покажет опрос, уведомив пользователя об ошибке.

6.3. Подпись результатов опроса

Для результатов, которые Simpoll отправляет Вашему сайту, подпись создается по другому алгоритму.

Поскольку в ответе Simpoll имеется один или несколько массивов, подпись строится из секретного ключа опроса и строки полученной после сериализации массива с ответом:


					MD5 ( ключ:SERIALIZE( массив результатов ) )

				

Для проверки подписи на своей стороне Вы должны сформировать ее на основании полученных от Simpoll результатов и сравнить с подписью, которую передал Simpoll. Если полученные подписи не совпадают, то ответ считается невалидным и результаты должны быть отброшены.

Например, Вы получаете ответ от Simpoll через скрипт result.php методом POST —

Пример проверки подписи:

					<?php

						// Ключ контрольной подписи опроса
						// задается в параметрах опроса на вкладке "API"
						$survey_secret_key = 'q1w2e3r4';

						// Получаем параметры, переданные от Simpoll через POST
						$results = $_POST;

						// Сохраняем подпись, полученную от Simpoll
						// и убираем ее из остального списка результатов
						$server_sig = $results['sig'];
						unset($results['sig']);

						// Формируем собственную контрольную подпись
						// на основании ключа и полученных от Simpoll результатов
						$signature = md5( $survey_secret_key . ':' . serialize($results) );

						// Сравниваем подписи
						if ($server_sig == $signature) {

							// ... подписи совпали, ответу можно доверять ...

						} else {

							// ... подписи не совпали, выходим ...
							exit;

						}

					?>
				

Если в массиве $_POST (или $_GET, в зависимости от метода) могут присутствовать параметры, не связанные с Simpoll (например, добавляемые вашей CMS при каждом запросе) то они должны быть удалены из массива результатов, чтобы не повлиять на формирование подписи.

Все параметры которые передает Simpoll имеют в своем названии префикс sp_, кроме тех, которые были переданы Вами.