我一直在网上查看关于加密网址中id的解决方案的文章。我已经尝试过基本的编码解码,但是我在下一页解码它时遇到的问题我做了一个选择,其中id = decode id。它不会从表中获取正确的用户。
我的链接:
My link:
<a href="sendContract.inc.php?id=<?php echo
encrypt($customer_id) ?>"> View Contract </a>
sendContract.inc.php页面:
$customer_id = $_GET['id'];
$decryped_id = base64_decode($customer_id);
$sql = "SELECT *
FROM bookings
LEFT JOIN customers
USING (customer_id)
WHERE customer_id = '".$decryped_id."'
";
更新:现在,我了解到需要使用的urlencode,它可以正确地在URL中使用。该页面显示客户合同。它只对他们来说是独一无二的。合同链接通过电子邮件发送,该电子邮件只是与其customer_id的链接(现在已对其进行编码,解码)。我想知道我还能做些什么来保护他们的链接和信息?合同在链接中显示为PDF(使用tcpdf)。
答案 0 :(得分:5)
我喜欢使用Hashids:
Hashids是small open-source library,它可以从数字生成简短,唯一,非连续的ID。
它将像347这样的数字转换为像“yr8”这样的字符串,或者像[27,986]这样的数字数组转换为“3kTMd”。
您还可以解码这些ID。这可以将多个参数捆绑到一个参数中,或者简单地将它们用作短UID。
Hashids已被移植到多种语言including PHP。以下是他们网站上的一个例子:
$hashids = new Hashids\Hashids('this is my salt'); $id = $hashids->encode(1, 2, 3); $numbers = $hashids->decode($id);
答案 1 :(得分:1)
您似乎没有加密ID,只是在base64中对其进行编码,这意味着任何人都可以对其进行解码。这是一个显示简单编码字符串的示例。
$str = 'This is an encoded string';
echo base64_encode($str);
这将输出VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw==
。如果您注意到,此字符串包含等号。实际上,base64编码的字符串可以包含“+”,“/”或“=”,它们都需要在URL存在之前进行URL编码。因此,在将urlencode()
函数传递给URL之前,请先使用它。例如,
$str = 'This is an encoded string';
echo urlencode(base64_encode($str));
将输出对于网址安全的VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw%3D%3D
。然后,当您需要像示例中那样解码URL时,您将执行以下操作。
$customer_id = $_GET['id'];
$decoded_id = base64_decode(urldecode($customer_id));
$sql = "SELECT *
FROM bookings
LEFT JOIN customers
USING (customer_id)
WHERE customer_id = '".$decoded_id."'
";
但要记住,此实施不会 加密 ID,它只是编码,这意味着任何人可以解码。
答案 2 :(得分:1)
我会专门为这个电子邮件操作创建一个表。在上表中,我将id
(自动增量),user_id
,create_date
和hash
。然后在电子邮件中,您将传递哈希并查看它。与user_id的关系存在,但您没有公开他们的实际帐户信息。您也可以在使用后或经过一段时间后删除此数据。这样链接只能在有限的时间内工作。您可以使用非常简单的连接INNER JOIN users ON {email_table}.user_id = user.id
或者您拥有的内容将此表连接回用户表。
对于哈希,它可以像
一样简单 md5($id . $create_date );
这样可以正常工作,只能使网址“漂亮”。因为您将表中的哈希值保存为行数据的一部分,所以它根本不需要与该行中的数据相关联。基本上它需要所有的猜测工作。我也会考虑不暴露'.php'扩展名。大多数MVC框架都可以做到这一点,它只是让网址像这样更清晰
http://yoursite.com/sendContract/jsdkfe1902303kllllde
在我看来,真正确保这一点的唯一方法是限制电子邮件中网址的使用频率和时长。您也可以强制他们登录网址,然后您可以确定它是帐户持有人。
答案 3 :(得分:0)
为了避免最终用户猜测ID,我可以建议一种使用散列id的方法。例如,您使用MD5作为哈希算法和数据库MySQL
你的网址会是 的 ... /路径?ID = {hashed_id} 强>
查看数据库时,您的查询将是
Select ...
From ...
Where MD5(ID_COLUMN) = {hashed_id}
通过这种方式,您只向客户公开id的散列值,而不是id本身。此外,您不需要维护可能泄露出来的密钥。