Для обеспечения безопасной передачи данных между Вашим сайтом и опросами 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_, кроме тех, которые были переданы Вами.