Я передаю $_GET[]; переменные в ссылке, но хотите зашифровать значения в URL-адресе. Обычно я использую сеансы, но, поскольку я не использую форму, а просто URL-адрес, какие у меня есть варианты. Я уверен, что есть способ использовать этот метод, поэтому я пытаюсь сделать его максимально безопасным.
Ниже мой код:
$cost = "152.00";
<a href="registration.php?class=Spanish&age=4-6&time=3pm&cost=<?echo $cost; ?>">
и Registration.php выглядит так
<?
$class = $_GET[class];
$age = $_GET[age];
$time = $_GET[time];
$cost = $_GET[cost];
?>
Если бы я мог использовать что-то вроде md5 для кодирования значений, а затем декодировать их в Registration.php, это было бы хорошо, или если бы был способ передать переменные $_session с помощью <a>, это было бы хорошо.
Ответ 1 · рейтинг 2 · Charles
Страница, на которую вы ссылаетесь, находится на том же сайте, что и сайт, с которого вы делаете ссылку?
Если да, то почему бы не вставить их в $_SESSION? Таким образом, они хранятся на сервере, где пользователь никогда не сможет ими манипулировать.
Другой вариант - фактически не шифровать данные, а но подписывать их с помощью HMAC. Если вы используете современную версию PHP, вы можете использовать hash_hmac . На стороне создания ссылки:
$validate = serialize(array( $class, $age, $time, $cost ));
$hmac = hash_hmac('sha1', $validate, 'secret key goes here');
$link = 'foo.php?...&validate=' . $hmac;
... и с другой стороны:
$validate = serialize(array( $_GET['class'], $_GET['age'], $_GET['time'], $_GET['cost'] ));
$hmac = hash_hmac('sha1', $validate, 'secret key goes here');
if($hmac != $_GET['validate']) {
echo "No hacking!";
exit;
}
На самом деле вы должны использовать эту технику для варианта № 3, а именно: использовать POST, то есть форму. Это удержит случайных пользователей от изменения данных.
Вариант № 4 является лучшим: хранить все эти конфиденциальные данные на стороне сервера для начала и ссылаться на них по уникальному идентификатору, который видит пользователь. Это с самого начала защищает данные от рук пользователя, а это означает, что вам никогда не нужно беспокоиться о том, что пользователь подделает их.
Ответ 2 · рейтинг 1 · Dolan Antenucci
Вы можете подумать о создании "хэш-ключа", состоящего из переменных, которыми вы не хотите манипулировать:
(отредактировано ниже, чтобы сделать немного яснее)
На первой странице (например, class.php) создайте ссылку следующим образом:
$paramStr = "class=Spanish&age=4-6&time=3pm&cost=$cost";
$globalSecretKey = "Some secret key string that you don't reveal to the user";
$publicKey = md5($globalSecretKey . $paramStr);
$link = "registration.php?$paramStr&hash=$publicKey";
Затем на Registration.php вы убедитесь, что хэш соответствует отправленным переменным:
$submittedParamStr = "class=" . $_GET['class'] . "&age=" . $_GET['age'] . "&time=" . $_GET['time'] . "&cost=" . $_GET['cost'];
$globalSecretKey = "Some secret key string that you don't reveal to the user";
$submittedDataKey = md5($globalSecretKey . $submittedParamStr);
// checking if submitted key matches submittedDataKey
if($_GET['hash'] != $submittedDataKey) die("Problem!");