6.1. Uso de firmas
Las firmas protegen los datos que intercambian tu sitio y una encuesta.
La firma de control es el hash MD5 de una cadena formada por los parámetros transmitidos. La «sal» es la clave secreta definida en la pestaña «API» de la configuración de la encuesta; se añade antes de calcular el hash. Como la clave solo la conocéis tú y Simpoll, un atacante no puede falsificar la firma aunque conozca el algoritmo.
Para usar firmas de control, activa la opción correspondiente en la pestaña «API» de la configuración de la encuesta.
6.2. Firmar los parámetros enviados a una encuesta
La sección 5 muestra cómo pasar parámetros a una encuesta en un campo oculto. Un visitante puede ver y modificar ese campo. La firma lo impide.
La firma es el hash MD5 de la clave secreta y los valores de todos los parámetros, separados por dos puntos:
MD5 ( key:parameter1:parameter2 )
Pon los valores en el mismo orden que en la cadena de consulta.
Después añade la firma a los parámetros como un parámetro más llamado sig.
Ejemplo de cómo pasar parámetros con firma:
<?php
// Key of the poll control signature
// is set in poll parameters on "API" tab
$survey_secret_key = 'q1w2e3r4';
// Array of parameters to be sent to
// our site once the poll is passed.
// Can be formed dynamically, if necessary.
$params_arr = array(
'user_id' => 123,
'user_login' => 'anonymous'
);
// Create control signature for parameter array
$signature = md5( $survey_secret_key . ':' . implode(':', $params_arr) );
// Add control signature to parameter list
$params_arr['sig'] = $signature;
// Create URL-coded inquiry line
$params_str = http_build_query($params_arr);
?>
<!—Create field with inquiry line -->
<input type="hidden" id="simpoll_params" value="<?php echo $params_str; ?>" />
<!—Connect the poll -->
<script type="text/javascript" src="https://simpoll.com/es/embed/framejs/aa7ca07e"></script>
Si un usuario cambia cualquier parámetro, la firma deja de coincidir: Simpoll no mostrará la encuesta e indicará un error.
6.3. Firma de los resultados
Los resultados que Simpoll envía a tu sitio se firman de otra manera.
Como la respuesta contiene arrays, la firma se calcula con la clave secreta y la respuesta serializada:
MD5 ( key:SERIALIZE( result array ) )
Para comprobarla, calcula la firma a partir de los resultados recibidos y compárala con la que envió Simpoll. Si no coinciden, rechaza los resultados.
Por ejemplo, si tu script result.php recibe los resultados por POST:
Ejemplo de comprobación de la firma:
<?php
// Key of poll’s control signature
// is set in parameters on "API" tab
$survey_secret_key = 'q1w2e3r4';
// Receive parameters sent from Simpoll through POST
$results = $_POST;
// Save signature received from Simpoll
// and remove it from the list of results
$server_sig = $results['sig'];
unset($results['sig']);
// Create own control signature
// on the basis of key and results received from Simpoll
$signature = md5( $survey_secret_key . ':' . serialize($results) );
// Compare signatures
if ($server_sig == $signature) {
// ... signatures match, response is reliable ...
} else {
// ... signatures mismatch, exit ...
exit;
}
?>
Si $_POST (o $_GET) puede contener parámetros que no tienen que ver con Simpoll (por ejemplo, los que tu CMS añade a cada petición), elimínalos antes de calcular la firma.
Todos los parámetros que envía Simpoll empiezan por sp_, salvo los que pasaste tú.