[英]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
}
$id= substr($_GET['ID'], 4, -4);
您可以使用substr()函数从字符串中删除前4个和后4个字符。 但更好的是,只需使用内置的php加密功能来封装你的id
在PHP中使用encrypt
和decrypt
函数。 不要相信自己的算法。 否则你可以在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,以及存储在数据库中的主键。
您的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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.