【问题标题】:Encrypt / Decrypt Primary Key instead of using UID?加密/解密主密钥而不是使用 UID?
【发布时间】:2011-01-18 23:49:51
【问题描述】:

虽然我总是检查是否允许某人访问记录,但我通常在查询字符串中使用 UID,因为我觉得它不鼓励像 ?id=1, ?id=2 那样“四处寻找”的诱惑。

虽然我发现跨多个表进行查找有点令人费解,因为您还需要存储 UID 而不仅仅是记录 ID。

如果我要通过查询字符串传递 id 号的加密字符串,然后将其解密以进行数据库查询,这会增加大量开销吗?

这意味着我可以只使用主键(尽管我仍然会很明显地检查他们是否有权查看记录)并且可以在每个会话中创建唯一链接(或在整个会话中随时更改) - 这将很有用如果有很多 AJAX 驱动的内容,您不希望他们尝试使用。

这真的是个坏主意吗?

【问题讨论】:

    标签: php mysql guid encryption


    【解决方案1】:

    为什么不只对 ID 进行 base64 编码/解码?如果您这样做只是为了防止合法用户尝试他们实际上有权玩的玩具,那么做任何特别花哨的事情来阻止他们真的没有任何目的。

    【讨论】:

    • 把它放在上下文中 - 如果我正在开发游戏,人们总是会尝试“游戏”系统。如果商店中有库存,他们可能会将该虚拟商店中的商品的 id/uid 标记为书签,稍后通过直接访问它来查看它。当然这是合法的,我无法阻止,但如果链接在每个会话或半小时内都是唯一的,并且对于该用户来说是唯一的,那么它就会停止四处寻找。
    • 谁在乎用户是否能够在虚拟商店中找到随机物品?为什么会出现这个问题?
    • 我希望所有内容都使用 1 次链接,以避免链接书签或玩家发送其他玩家链接的可能性。
    【解决方案2】:

    将您的 UID 设为哈希并通过它。

    除非您不想重构整个架构和代码库,否则请使用 rot13 / base64 对其进行编码。

    【讨论】:

      【解决方案3】:

      您绝对应该检查每个请求的权限。您永远不应该仅仅依靠输入数据来保证安全!

      请记住,如果您可以解密它,想要入侵您网站的恶意用户也可以。

      使用会话存储权限是在安全性与性能之间的权衡,我认为这样做的安全性一般。

      但是 - 如果您有敏感数据 - 每次都检查每个请求。不要以降低安全性为名优化几微秒。


      现在我在评论中看到了您的真正问题,我可以建议为用户进行的每次刷新使用某种额外的哈希并将其保存在用户的会话中。然后检查用户是否使用相同的哈希,例如:

      $hash = md5(microtime());
      $_SESSION['secret_user_hash'] = $hash;
      

      并将其放在 URL 中,例如:

      &z=<?php echo substr($hash, 5, 10); ?>
      

      在用户发出请求后,只需检查它是否是相同的哈希值。

      请记住,如果您使用重度 AJAX,则在会话中更改哈希值时,您应该始终更新哈希值。我能想到的最好方法是在随机哈希的会话中保留一个数组(例如 5)并随机使用它们进行查询。所以你有一个更大的池,你不必在每次请求后更新。

      【讨论】:

      • 这些功能仍然会检查权限并且它不是真正的敏感数据,它只是每次创建唯一链接而不重构数据库或更改任何内容的想法。我想我可以测试做一堆加密/解密查询而不是直接 uid 需要多长时间,看看这是否会影响大量使用情况,即 5000 个同时用户等。
      • “我可以建议为用户进行的每次刷新使用某种额外的哈希并将其保存在用户的会话中。然后检查用户是否使用相同的哈希”->这将起作用停止他们为它添加书签,并且为每个查询解密字符串的开销更少->它仍然允许我每 X 分钟刷新一次哈希,这样他们以后就不能再回来了。
      • 加密和解密并不像使用数据库那样昂贵,因此您的主要负载将在数据库上。不用担心加密。只是不要让它太复杂......至于哈希 - 请记住,可能有一些用户只是长时间打开他们的游戏窗口,这可能会改变他们的哈希。您可以尝试发送一些常规请求以保持会话处于活动状态而不更改哈希值。
      • 我完全不明白为什么需要对 id 进行加密。如果您使用会话数据来推动页面之间的转换,那么无论如何都无法使用书签。
      【解决方案4】:

      为什么它会影响您访问数据的方式,访问和显示是两个独立的实体。 您的密钥应该在查询中使用,但如果您不想显示,则永远不需要显示它。你可以散列它,你可以修改重写,所以它永远不会在 url 中可见......有很多选项,同时仍然查询你的表中的键。如果您设置了模式,您甚至可以即时生成它以供显示。 P+IDHASH+ANATTRIBUTE 什么的。在整数上使用 base64 并解码来运行您的查询不会花费您超过毫秒左右的时间。请记住,您没有在查询中散列,因此它们将保持不变您将编码/解码一个项目,这不是时间问题

      【讨论】:

      • 这基本上是我开始使用 MCRYPT_RIJNDAEL_256 和 base64 编码 + mod_rewrite 实现它的方式,所以我最终得到类似: /bank/create_account/91xqJttvM61PH|9d+ahAeDtrZ2apBna8Yhz83deROZg= 它将查询银行 ID =1 为用户创建一个帐户。银行之间的交易将类似于 /bank/transaction/91xqJttvM61PH|9d+ahAeDtrZ2apBna8Yhz83deROZg=/LemOfavO6jNi1yZQbYgE0J|MtLSyVePMkgauJPLTWxI= 向该银行发送 $x。它似乎工作正常 - 你是对的,这只是一点点开销。
      猜你喜欢
      • 1970-01-01
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      相关资源
      最近更新 更多