加密URL中的$_GET变量,使用户无法访问其他配置文件


Encrypting $_GET variable in URL so user cannot access other profiles

我希望能够通过电子邮件向我的客户发送到他们个人资料的链接。链接看起来像这样;

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

你可以这样做:

  1. 创建email链接时,使用simple md5函数加密id。

$token = md5($tenant_id); // i.e.output: a5bfc9e07964f8dddeb95fc584cd965d

  • 将"token"保存到该用户的db中(您可以添加一个名为token的列或类似的东西)

  • 当用户使用tenant_id参数进入配置文件时(我会使用"token"而不是"t"来给可能的攻击者提供更少的信息),通过添加的新列在db搜索中查找该值。

  • 完成了,你不需要知道更多关于加密的知识:)