繁体   English   中英

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

[英]PHP, Get $_GET to ignore numbers from url

我目前正在使用一个程序来发送新闻通讯,在我发送链接的每个时事通讯中,客户可以查看他自己的数据,并从新闻通讯中查看/取消发布。 我现在使用的链接是: 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从URL获取ID。

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

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

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

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

$_GET['var'] = 123543123;

得到543你需要使用函数substr()

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

您可以在服务器上使用两列来代替尝试隐藏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
}

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

就像是

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

应该做你想要的技巧

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

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

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

这会奏效

$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以获取唯一字符串。

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

像这样的东西?

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

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

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

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

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

$ _SESSION [ “密码”]

之前由用户根据登录过程设置的内容,例如:

subscriptionsedit.php?page=1&ID=77

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

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

您可以使用

preg_match('/^\d{4}(\d{4})/', $_GET['id'])
$ID = substr($_GET['ID'], 3, -4);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM