PHP,获取$ _GET以忽略来自网址的数字

时间:2013-05-08 09:45:37

标签: php get

我目前正在使用一个程序来发送新闻通讯,在我发送链接的每个时事通讯中,客户可以查看他自己的数据,并从简报中查看/取消发布。我现在使用的链接是:http://localhost/Mail/subscriptionseditklant.php?ID=77并使用以下代码创建:

<a href="subscriptionsedit.php?page=1&ID=<?=$objResult["ID"];?>">subscriptions</a>

出于安全原因,我不想展示客户ID=77部分,因此他无法修改它以查看其他客户信息。我的想法是将ID隐藏在随机数字中(前面4个,后面4个ID),我用它做了这个:

<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从网址获取ID。

我的问题:
有什么方法可以让$_GET忽略ID中的前4个和后4个数字,以便它能捕获正确的ID吗?

我试图谷歌这样的东西,但因为我不知道它是如何调用(如果它甚至存在)我无法找到任何东西。我希望我的问题很明确,但如果你有任何疑问,请问他们! (如果有人知道这个问题的更好标题,可以随意编辑它,因为我不知道如何命名这个问题)

11 个答案:

答案 0 :(得分:2)

隐藏号码是不好的解决方案,更好的方法是通过http://php.net/manual/en/function.mcrypt-encrypt.php

加密此号码

当然你可以忽略将这个$ _GET ['var']转换为char数组的字母,然后使用范围例如

$_GET['var'] = 123543123;

要获得543,您需要使用函数substr()

$hidden_number = substr($_GET['var'],3,3);

答案 1 :(得分:2)

您可以在服务器上使用具有两列的映射表,而不是尝试隐藏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添加到网址,然后在收到时验证。

$id = $_GET['id'];
$salt = $_GET['salt'];

if (hash_hmac('sha1', $id . $salt, 'some super secret key') === $_GET['signature']) {
    // valid
}

答案 2 :(得分:1)

查看substr方法的手册:http://php.net/substr

类似

$id = substr($_GET['ID'],4,-4); 

应该做你想要的技巧

答案 3 :(得分:1)

$id= substr($_GET['ID'], 4, -4);

答案 4 :(得分:0)

您可以使用substr()函数从字符串中删除前4个和后4个字符。 但更好的是,只需使用内置的php加密函数来加密你的id

答案 5 :(得分:0)

在PHP中使用encryptdecrypt函数。不要相信自己的算法。否则你可以在php中使用substr()。

答案 6 :(得分:0)

这将起作用

$id='1234554321';
preg_match('/\d{4}(\d+)\d{4}/', $id, $matches);
var_dump($matches[1]);

但是...

我不会这样做。

我会生成一些唯一的字符串,存储它数据库并将其提供给最终用户。所以这个网址就是lilke这个

example.com/view.php?token=<unique-string>

请参阅http://php.net/manual/en/function.uniqid.php以获取唯一字符串。

答案 7 :(得分:0)

您可以在PHP中使用substr()来提取您需要的ID。

这样的东西?

<?php echo substr($_GET['ID'], 4, -4); ?>

但是出于'安全'的原因,这是一个可怕的可怕想法。

你最好使用非增量的ID,因此是“可猜测的”。尝试使用md5()函数或其他内容生成其他ID,以及存储在数据库中的主键。

http://php.net/manual/en/function.md5.php

答案 8 :(得分:0)

您的subscriptionsedit.php脚本应接受客户ID并查找

$ _ SESSION [ “PASSWORD”]

以前由用户根据登录过程设置,如:

subscriptionsedit.php?page=1&ID=77

look at password stored in the $_SESSION["PASSWORD"] field 

这样做就不可能偷偷摸摸其他客户的数据,因为$ _SESSION []是服务器为每个用户保存的私人信息

答案 9 :(得分:-1)

您可以使用

preg_match('/^\d{4}(\d{4})/', $_GET['id'])

答案 10 :(得分:-1)

$ID = substr($_GET['ID'], 3, -4);

http://www.php.net/manual/en/function.substr.php