为现有的MySQL架构实现模糊的唯一标识符

时间:2011-03-28 23:31:40

标签: php mysql security url authentication

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

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

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

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

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

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

更新正如Charles所述,ACL是首选解决方案,但网站的某些部分对公众开放,因此无法对这些区域进行ACL。但是,我们在应用程序后端广泛使用ACL。

1 个答案:

答案 0 :(得分:3)

  

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

您的代码不应该有访问控制,以防止这种情况发生吗?这将是一个更加理智的解决方案,而不是模糊标识符将为您带来的"security through obscurity"


  

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

烨!请记住将列标记为UNIQUE

  

所以我一直在考虑其他方法,并希望就是否有任何重大问题需要关注。

你提到的三个选项都是以自己的方式愚蠢。您只需要该表中该行的唯一标识符。拉一些entropy out of thin air并对其进行足够的编码,宾果游戏,你有自己的唯一标识符。不要太聪明,你会发现自己的脚踩着自己造成的子弹。 根据内容的哈希值或行的现有顺序标识符生成随机数据。 HMAC 可以在这里足够好。

另一方面,关于如何将ORM挂钩到新标识符,或者在创建新行时为它生成一个,我不会有最微妙的想法。