Я бы хотел предложить свое решение:
Защиту данных можно разделить на следующие аспекты:
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 или вручную администратором.