Задать вопрос

GET параметры. Как запретить изменение их вручную?

Как запретить изменение каких либо GET параметров пользователю? Тоесть если человек перешел по ссылке с гет параметрами, то все норм. а если сам ввел туда что то, то ошибка?
  • Вопрос задан
  • 1830 просмотров
Подписаться 5 Оценить 1 комментарий
Решения вопроса 2
riky
@riky
Laravel
ко всем ссылкам добавлять сигнатуру.

пример функции для генерации ссылок
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
сигнатуры будут одинаковые
Ответ написан
sergiks
@sergiks Куратор тега PHP
♬♬
Добавлять параметром подпись, которая считается как хэш от параметров в ссылке и некого «секрета», известного только серверу. Такую подпись злодей не сможет подделать (с приемлемой вероятностью), а при изменении параметров, подпись не совпадёт, при проверке на сервере. Такая схема, в частности, применяется во ВКонтакте для проверки 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-параметры проверяются: необходимо наличие подписи, и её совпадение с переданными параметрами. Подпись для полученных параметров вычисляется так же, как и при генерации ссылки – и сравнивается с переданной подписью.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
miraage
@miraage
Старый прогер
JWT, например.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы