3

我目前正在使用一个程序来发送时事通讯,在每个时事通讯中我都会发送一个链接,以便客户可以查看他自己的数据和从时事通讯中订阅/取消订阅。我现在使用的链接是这样的: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

在我$_GET用来从 url 获取 ID 的 subscriptionsedit.php 上。

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

我试图用谷歌搜索类似的东西,但因为我不知道它是如何被调用的(如果它甚至存在的话)我什么也找不到。我希望我的问题很清楚,但如果您有任何问题,请问他们!(另外,如果有人知道这个问题的更好标题,请随时编辑它,因为我不知道如何命名这个问题)

4

11 回答 11

2

隐藏号码是不好的解决方案,更好的方法是通过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-08T09:47:44.330 回答
2

您可以在服务器上使用包含两列的映射表,而不是尝试隐藏 id:primary(hash), id

哈希可以是随机 blob,但为了便于阅读,您也可以使用uuid,例如

hash                                 | id
-------------------------------------+----
9d76d130-0119-4d7a-9eed-95ad3617e512 | 123

然后,在 url 中使用哈希。随机散列的优点是散列和 id 之间没有相关性,除了服务器端的表。

uniqid()使用and md5()or可以获得更小的哈希值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$saltURL 中,然后在收到时验证它。

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

if (hash_hmac('sha1', $id . $salt, 'some super secret key') === $_GET['signature']) {
    // valid
}
于 2013-05-08T09:57:10.143 回答
1
$id= substr($_GET['ID'], 4, -4);
于 2013-05-08T09:55:30.387 回答
1

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

就像是

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

应该做你想做的事

于 2013-05-08T09:49:02.073 回答
0

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

于 2013-05-08T09:49:27.823 回答
0

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

于 2013-05-08T09:49:59.217 回答
0

这会起作用

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

但..

我不会那样做的。

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

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

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

于 2013-05-08T09:50:12.800 回答
0

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

像这样的东西?

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

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

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

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

于 2013-05-08T09:53:12.777 回答
0

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

$_SESSION["密码"]

先前由用户作为登录过程的结果设置,例如:

subscriptionsedit.php?page=1&ID=77

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

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

于 2013-05-08T10:03:31.733 回答
-1

您可以使用

preg_match('/^\d{4}(\d{4})/', $_GET['id'])
于 2013-05-08T09:49:26.053 回答
-1
$ID = substr($_GET['ID'], 3, -4);

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

于 2013-05-08T09:49:40.603 回答