2011-03-08 91 views
1

我传递$ _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变量,那会很好。

+0

您无法反转md5散列。如果可以的话,它会失去它的目的。您可以使用密钥加密将加密值传递给脚本并将其解密。 – Kyle 2011-03-08 04:06:59

回答

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是最好的:存储所有敏感数据服务器端以开头,并以用户看到的唯一标识符引用它。这使数据不会从用户手中开始,这意味着您永远不必担心用户会篡改它。

+0

页面位于同一网站上,但如果我不使用表单提交数据,该如何设置会话变量。如果用户点击schedule.php上的链接,它需要在登录前设置会话.php – Denoteone 2011-03-08 04:16:38

+0

我更新了我的帖子,它恰好包含了您确实使用表单和POST方法的建议。如果你能提供帮助,你实在不应该在公开场合传递敏感数据。 – Charles 2011-03-08 04:19:12

+0

我同意。由于将涉及定价,我将使用表单,但如果页面上有多个链接,将其转换为表单的最佳方式是什么? – Denoteone 2011-03-08 04:24:34

1

你可以考虑建立一个“哈希键”,也就是由你不想操纵的变量:

(下面编辑来让更清楚一点)

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

不知道这是否会奏效。由于class.php具有与每个链接关联的不同变量的所有链接。这样做有助于根据用户点击上一页的链接,使用特定数据填写注册表单。 – Denoteone 2011-03-08 04:21:03

+0

我更新了我的帖子,详细阐述了我的建议 – 2011-03-08 04:29:12