GET параметры. Как запретить изменение их вручную?
ко всем ссылкам добавлять сигнатуру. 
пример функции для генерации ссылокfunction getLink($url, $data) {
  ksort($data);
  $query = http_build_query($data);
  $signature = sha512($_SESSION['salt'] . $query);
  return $url . '?' . $query . '&sign=' . $signature;
}
при получении запроса - добавить аналогичную функцию для проверки сигнатуры. function checkSign() {
  $data = $_GET;
  $signQuery = $_GET['sign'];
  unset($data['sign']);
  ksort($data);
  $query = http_build_query($data);
  $signature = sha512($_SESSION['salt'] . $query);
  return $signature === $signQuery;
}
если юзер чтото поменяет то сигнатура не сойдется.
чтобы увеличить безопасность лучше в сигнатуру добавить еще и юрл. иначе у 
/users/?id=5
/post/?id=5
сигнатуры будут одинаковые
JWT, например.