编码URL $ _GET变量

时间:2011-03-08 04:03:25

标签: php html get

我正在传递$ _GET [];链接中的变量但想要加密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上对它们进行解码,那将是好的,或者如果有办法使用<a>来传递$ _session变量那将是好的。

2 个答案:

答案 0 :(得分:2)

您链接的网页与您正在建立链接的网站位于同一网站上吗?

如果是这样,为什么不坚持$_SESSION ?这样,它们就存储在服务器上,用户永远不会想到操纵它们。

另一个选项实际上并非加密数据,而是使用an 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是最好的:开头存储所有敏感数据服务器端,并通过用户看到的唯一标识符引用它。这样就可以将数据从用户的手中开始,这意味着您永远不必担心用户会篡改它。

答案 1 :(得分:1)

你可以考虑创建一个由你不想操纵的变量组成的“哈希键”:

(编辑如下以使其更清晰)

在第一页(例如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!");