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_, кроме тех, которые были переданы Вами.