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

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


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


Ответы (2)


Страница, на которую вы ссылаетесь, находится на том же сайте, что и сайт, с которого вы делаете ссылку?

Если да, то почему бы не вставить их в $_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 является лучшим: хранить все эти конфиденциальные данные на стороне сервера для начала и ссылаться на них по уникальному идентификатору, который видит пользователь. Это с самого начала защищает данные от рук пользователя, а это означает, что вам никогда не нужно беспокоиться о том, что пользователь подделает их.

person Charles    schedule 08.03.2011
comment
Страница находится на том же сайте, но как мне установить переменную сеанса, если я не использую форму для отправки данных. Если пользователь щелкнет ссылку на schedule.php, ему нужно будет установить сеанс до перехода к Registration.php - person Denoteone; 08.03.2011
comment
Я обновил свой пост, и в нем есть предположение, что вы действительно используете форму и метод POST. Вы действительно не должны передавать конфиденциальные данные в открытом доступе, если можете помочь. - person Charles; 08.03.2011
comment
Я согласен. Поскольку будет задействована цена, я буду использовать форму, но если на странице есть несколько ссылок, как лучше всего преобразовать ее в форму? - person Denoteone; 08.03.2011

Вы можете подумать о создании «хэш-ключа», состоящего из переменных, которыми вы не хотите манипулировать:

(отредактировано ниже, чтобы сделать немного яснее)

На первой странице (например, 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!");
person Dolan Antenucci    schedule 08.03.2011
comment
Не уверен, что это сработает. Так как class.php имеет все ссылки с разными переменными, связанными с каждой ссылкой. Для чего это помогает заполнить регистрационную форму конкретными данными в зависимости от того, по какой ссылке пользователь нажимает на предыдущей странице. - person Denoteone; 08.03.2011