Добавлять параметром подпись, которая считается как хэш от параметров в ссылке и некого «секрета», известного только серверу. Такую подпись злодей не сможет подделать (с приемлемой вероятностью), а при изменении параметров, подпись не совпадёт, при проверке на сервере. Такая схема, в частности,
применяется во ВКонтакте для проверки GET-запроса при открытии iFrame приложений.
Например, ваша ссылка должна содержать параметры
param_a и
param_b. Когда вы её генерируете на сервере, добавляется параметр
sign, равный md5-хэшу от строки, полученной конкатенацией названий параметров, их значений и секретного ключа:
$secretKey = "nXYFyArf6F6iQXTzg"; // хранится в тайне, известен только серверу
$a = "значение неподделываемого параметра А";
$b = "значение неподделываемого параметра B";
$params = array(
'param_a' => $a,
'param_b' => $b,
'sign' => md5( "param_a" . $a . "param_b" . $b . $secretKey),
);
printf( '<a href="http://site.com?%s">Суперссылка</a>', http_build_query($params));
На сервере полученные GET-параметры проверяются: необходимо наличие подписи, и её совпадение с переданными параметрами. Подпись для полученных параметров вычисляется так же, как и при генерации ссылки – и сравнивается с переданной подписью.