Не так давно Vkontakte ввело возможность разработки iFrame приложений. В связи с этим у многих разработчиков встал вопрос как защитить данные, передаваемые между приложением и api.Я бы хотел предложить свое решение:
Защиту данных можно разделить на следующие аспекты:
1. Подтверждение информации о пользователе.
Чтобы получить достоверные подписанные данные о пользователе, необходимо использовать первый запрос к API в настройках приложения.
method=getProfiles&uids={viewer_id}&format=json&v=2.0
Тем самым мы получаем несколько параметров, один из которых нужный нам - viewer_id, а также сигнатуру данных (auth_key), подписанных секретным ключом, который гарантирует нам верность данных.Т.е. на следующих этапах мы можем использовать информацию о пользователе, не боясь что данные были подменены.
2. Передача данных от пользователя к приложению
Чтобы скрыть секретный ключ и при этом иметь возможность передать данные на сервер придется использовать промежуточное звено - наш ajax обработчик.
Клиентский JavaScript:
function secureSend(_data, _callback) {
$.ajax({
type: "POST",
url: "ajax.php",
data: (_data),
dataType: "json",
success: function(data) {
if(data.error != undefined) {
error(data.error);
return false;
} else {
_callback(data.response);
}
}
});
}
На сервере же расположить скрипт обрабатывающий только обращения к API, которые пересылают данные от пользователя к серверу. Разрешить можно все действия, т.к. пользователя мы проверили на предыдущем этапе и уже тут он волен сколько угодно раз пересылать свои голоса к приложению :)ajax.php, серверный скрипт
$vk_allow_methods = array("secure.withdrawVotes", "secure.getBalance");
$q = $_POST;
$d = "";
if(in_array($q['method'], $vk_allow_methods)) {
$d = vkSend($q['method']);
}
function vkSend($method) {
$server = "http://api.vkontakte.ru/api.php?";
$key = "000";
$aid = 1;
$qr = array();
$qr[] = 'method='.$method;
$qr[] = 'api_id='.$aid;
$qr[] = 'v=2.0';
$qr[] = 'format=JSON';
$qr[] = 'timestamp='.time();
$qr[] = 'random='.rand(1, 999999);
$qr[] = 'test_mode=1';
sort($qr);
$url4sign = implode("", $qr).$key;
$sign = md5($url4sign);
$url = implode("&", $qr)."&sig=".$sign;
return file_get_contents($server.$url);
}
echo $d;
3. Передача данных от приложения к пользователю.
Такие события не должны ни в коем случае инициироваться клиентским кодом. Если необходимо перевести голоса со счета приложения на счет пользователя, то лучше воспользоваться запароленым скриптом, вызывающимся по cron или вручную администратором.
В ходе построения клиент-серверного приложения, требуется реализовать возможность защищенной передачи данных.
Начал изучать