【问题标题】:implement obscured unique identifiers for existing MySQL schema为现有 MySQL 模式实现模糊的唯一标识符
【发布时间】:2011-07-24 21:17:07
【问题描述】:

我有一个用于 PHP5 应用程序的现有 MySQL 数据库架构。该应用程序是在一个流行的 MVC 框架中构建的(哪个并不重要)。我们使用 Doctrine ORM 1.2.x 作为 out ORM。

默认路由使用主 ID,在我们的例子中只是一个无符号自动递增整数。但是有些数据是敏感数据,虽然我们在 SSL 下运行,但更改 url 中的 ID 值可能会导致用户无权查看机密数据。

我认为的解决方案是使用一些模糊的值来代替更明显的记录 ID。

理想情况下,我们只需在受影响的表中添加一个新列,并为该记录生成一些唯一的随机或散列值,对吗?

但是,我可以想象到其他几个表/路由迟早需要相同的处理,并且希望有一个可重复使用的解决方案,可以避免一系列数据库更新。所以我一直在考虑替代方法,并想就是否有任何需要关注的重大问题发表意见。

  • 简单地混淆值,即移位和/或 base 64 编码
  • 快速而讨厌的加密
  • 使用 hmac 确保给定的 id 与给定的 hmac 匹配

更新 正如Charles 所述,ACL 将是首选解决方案,但是该站点的某些部分对公众开放,因此这些区域的 ACL 是不可能的。但是,我们确实在应用程序后端广泛使用了 ACL。

【问题讨论】:

    标签: php mysql security url authentication


    【解决方案1】:

    更改 url 中的 ID 值可能会允许用户访问无权查看的机密数据。

    您的代码不应该有防止这种情况发生的访问控制吗?这将是一个比混淆标识符带来的"security through obscurity"理智的解决方案。


    理想情况下,我们只需向受影响的表添加一个新列并为该记录生成一些唯一的随机或散列值,对吗?

    是的!请记住将该列标记为UNIQUE

    所以我一直在考虑替代方法,并想就是否有任何需要关注的重大问题发表意见。

    您提到的三个选项各有千秋。您所需要的只是该表中该行的 唯一 标识符。拉一些entropy out of thin air 并对其进行足够的编码,然后宾果游戏,你就有了你的唯一标识符。不要太聪明,你会发现自己的脚被一颗自己造成的子弹穿过。 不要根据内容的哈希值或行的现有顺序标识符生成随机数据。 HMAC 可能在这里已经足够好了。

    另一方面,我不知道如何将您的 ORM 连接到新标识符,或者在创建新行时让它为您生成一个。

    【讨论】:

    • 我很清楚“通过默默无闻的安全”的弊端,但是网站的某些部分对公众开放,并且用户不需要经过身份验证,因此 ACL 是不可能的。我们在应用程序后端广泛使用 ACL。
    • 让我有点困惑——如果你有机密数据只能对特定用户可见,他们从哪里获得自己的一组 I-can-look -at-this IDs 开始?我的意思是,您在某个时候拥有这些数据,对吗? 机密数据向公众开放这两个短语的组合不计算。
    • 公众成员可以注册兴趣,甚至可以购买门票,私人举办研讨会等。此时我们会生成发票(“机密”数据),我们可以通过公开链接下载这些发票,也可以在后端下载给授权用户。下载 pdf 的链接类似于 (example.com/seminar/:seminar_id/invoice/:invoice_id/)。这留下了invoice_id 被更改的可能性,并可能偶然发现其他人的发票,其中列出了私人数据,即公司名称和账单地址。
    • 至于插入 ORM,我们已经解决了。
    • 我们实际上目前正在使用openssl_random_pseudo_bytes 来生成随机的unique_key atm :)
    猜你喜欢
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    相关资源
    最近更新 更多