Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Переменные URL-адреса кодирования $_GET

Автор вопроса: DenoteoneОтветов: 2

Я передаю $_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>, это было бы хорошо.

  • вы не можете отменить хэш md5. Если бы вы могли, это потеряло бы свою цель. Вы можете использовать шифрование с ключами, чтобы передать зашифрованное значение сценарию и расшифровать его. Kyle 08.03.2011

phpgethtml

Ответы

Ответ 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!");

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы