我目前正在使用一个程序来发送时事通讯,在每个时事通讯中,我都会发送一个链接,这样客户就可以从时事通讯中查看自己的数据和sub/unsub。我现在使用的链接是这样的:http://localhost/Mail/subscriptionseditklant.php?ID=77,由下面的代码组成:
<a href="subscriptionsedit.php?page=1&ID=<?=$objResult["ID"];?>">subscriptions</a>出于安全原因,我不想显示客户ID=77部件,这样他就不能修改它来查看其他客户信息。我的想法是将ID隐藏在随机数中(4个在前面,4个在后面),我用下面的方法做到了:
<a href="subscriptionsedit.php?page=1&ID=<? echo rand(1000,9999); ?><?=$objResult["ID"];?><? echo rand(1000,9999); ?>">subscriptions</a>这将显示如下所示的链接:http://localhost/Mail/subscriptionsedit.php?page=1&ID=9755774430
在subscriptionsedit.php上,我使用$_GET从url获取ID。
我的问题是:
有没有办法让$_GET忽略ID中的前4个和后4个数字,以便捕获正确的ID?
我试着在谷歌上搜索这样的东西,但由于我不知道它是怎么叫的(如果它真的存在),我什么也找不到。我希望我的问题是清楚的,但如果你有任何问题,可以问他们!(另外,如果有人知道这个问题的更好标题,请随意编辑它,因为我不知道如何命名这个问题)
发布于 2013-05-08 17:47:44
隐藏数字是一个糟糕的解决方案,更好的方法是通过http://php.net/manual/en/function.mcrypt-encrypt.php加密这个数字
当然,您可以忽略将这个$_GET‘’var‘转换为char数组的字母,然后使用range,例如
$_GET['var'] = 123543123;要获得543,您需要使用函数substr()
$hidden_number = substr($_GET['var'],3,3);发布于 2013-05-08 17:57:10
您可以在服务器上使用一个包含两列的映射表,而不是尝试隐藏id : primary(hash),id
哈希可以是一个随机的blob,但是为了可读性,你也可以使用一个uuid,例如
hash                                 | id
-------------------------------------+----
9d76d130-0119-4d7a-9eed-95ad3617e512 | 123然后,在url中使用散列。随机散列的优点是,除了服务器端表之外,散列和id之间没有相关性。
可以通过使用uniqid()和md5()或sha1()获得较小的散列
sha1(uniqid('', true));替代
如果ID本身是公共的,但您只是想避免篡改,请查看hash_hmac()
$salt = md5(uniqid('', true));
$signature = hash_hmac('sha1', $id . $salt, 'some super secret key');使用类似于base64_encode(openssl_random_pseudo_bytes(8))的方法生成密钥
您也可以将此$signature和$salt添加到URL中,然后在收到它时进行验证。
$id = $_GET['id'];
$salt = $_GET['salt'];
if (hash_hmac('sha1', $id . $salt, 'some super secret key') === $_GET['signature']) {
    // valid
}发布于 2013-05-08 17:49:02
查看手册中的substr方法:http://php.net/substr
就像这样
$id = substr($_GET['ID'],4,-4); 应该做你想要的把戏
https://stackoverflow.com/questions/16437447
复制相似问题