【问题标题】:URL parameters value encryption/decryptionURL参数值加密/解密
【发布时间】:2011-12-06 18:12:20
【问题描述】:

我想像这样加密 url 参数值

http://www.sitename.com/index.php?userid=12546

进入

http://www.sitename.com/index.php?userid=SADFFHGFE

为了防止机器人破解自动递增到数据库中的用户 ID,我不确定 base64_encodebase64_decode 的安全性。有没有办法做到这一点??

【问题讨论】:

标签: php encryption


【解决方案1】:

有什么办法吗?

散列用户 ID 是无用的,因为它很容易恢复。加密它们既不实际也没有必要——只需在创建记录时分配一个随机用户 ID,并且永远不要公开自动增量 ID。

【讨论】:

  • 这个问题与stackoverflow.com/questions/4940348/… 重复,但我相信这是一个比其他问题更好的答案。啊,举报还是不举报……这是个问题。 :)
  • @Herbert Flag,我想说,但不是重复,而是一个毫无意义的问题。
【解决方案2】:

你可以创建一个 id 的哈希值,这样你就可以得到类似的东西:

http://www.sitename.com/index.php?userid=81dc9bdb52d04dc20036dbd8313ed055

在您的数据库查询中,您可以对用户表进行选择,包括一个 WHERE 语句,该语句还散列 id 列,例如:

WHERE MD5(id) = youridfromqueryparameters

对此的附带说明是 MD5 散列不一定必须是唯一的。所以你不能确定这个 select 语句总是返回你想要的行。

当然,它与仅使用 id 并没有太大区别。更好的解决方案可能是为每个用户生成一个唯一的(不是自动递增的)id,并在 url 中使用它(加密与否)。

【讨论】:

  • 你说的很对。我会将注释添加到我的帖子中。
  • 为每个用户生成唯一(非自动递增)ID 的意义何在?
  • @hakre 任何已知的小于 20 亿的数字字符串的冲突?
  • @col。弹片:重点是用户的id不容易被猜到,在url中输入就可以访问其他用户的信息。请注意,id 代表标识符,不一定代表数据库表的第一列。
【解决方案3】:

您可以存储一个随机生成的字符串,并将其存储在与用户记录相同的行中,我使用它为我的网站上的测验生成一个随机 ID:

它使用字符列表生成一个字符串,因此它们必须区分大小写。

$p_length是要输出的字符数,我用'6'

function generate_id($p_length)
{
    $char_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $char_list .= "abcdefghijklmnopqrstuvwxyz";
    $char_list .= "1234567890";
    $char_list_len = strlen($char_list);
    $random = "";

    for($i = 0; $i < $p_length; $i++)
    {
        $char = rand() % $char_list_len;
        $random .= $char_list[$char];
    }
    return $random;
}

$random_id = generate_id(6);

【讨论】:

  • 注意: 从 PHP 4.2.0 开始,不需要使用 srand() 或 mt_srand() 为随机数生成器播种,因为现在这是自动完成的。
  • 如何防止为多条记录添加相同的生成ID?
  • @hakre 这是一个很好的观点,我将数据库中的字段设置为 UNIQUE 并循环遍历,检查生成的 ID 是否尚未存储。
猜你喜欢
  • 2018-04-21
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多