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