我希望能够通过电子邮件向我的客户发送到他们个人资料的链接。链接看起来像这样;
https://www.example.com/admin-area/files/edit_tenant.php?tenant_id=37我不希望用户能够将'37'更改为'38'并编辑另一个人的个人资料。
我想我需要以某种方式加密'37'。我已经在网上做了研究,但我觉得我可能想得太多了,因为我开始遇到"盐"等。
我是一个简单但安全的解决方案,使用PHP。
在用户表中定义一个"token"字段。当用户在系统中注册时,生成一个随机字符串(假设是40个字符)并插入这个令牌以及其他信息。所以当你想查找一个用户时,查找他/她的令牌,而不是id。这样就没有人能猜出别人的代币了!
为了生成随机字符串,你可以使用下面的函数:function generateRandomString($length = 40) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[random_int(0, $charactersLength - 1)];
}
return $randomString;
}
注意:random_int()
是一个PHP 7函数,但有一个polyfill可用于PHP 5
不允许添加(删除)标识,这是正确的方式!你可以看看这一页。简而言之:你不必使用哈希/混淆函数。相反,您将生成唯一的随机id(例如uuid)。
我同意Mario的观点,从安全角度来看,这可能不是最好的主意……然而,如果你绝对必须能够给用户这样的访问,那么你可以使用php哈希函数。创建一个基于userID+Email/其他标识符的哈希,并将其保存到数据库…然后使用它作为userID=
哈希函数信息:http://php.net/manual/en/function.hash.php
你可以这样做:
- 创建email链接时,使用simple md5函数加密id。
$token = md5($tenant_id); // i.e.output: a5bfc9e07964f8dddeb95fc584cd965d
-
将"token"保存到该用户的db中(您可以添加一个名为token的列或类似的东西)
-
当用户使用tenant_id参数进入配置文件时(我会使用"token"而不是"t"来给可能的攻击者提供更少的信息),通过添加的新列在db搜索中查找该值。
完成了,你不需要知道更多关于加密的知识:)