2

我的数据库有大约 100 个表,每个表有 1,000 到 20,000 行。每个表都有一个名为 id 的主键 - 例如,在引用表中的行时,我只是使用 idwww.domain.com/viewuser.php?id=3

我很确定我的代码中没有对行 ID 的硬编码引用,它们都引用了用户登录时设置的 POST 值或会话 ID。

是否可以轻松地将所有现有表的 id 从自动递增整数更改为唯一的字母数字 id,而不会导致大量重新编码或更改现有查询等?如果是这样,我会怎么做?

我的想法是手动更新我所有的表,但这也需要更改每个插入?我可以对介于两者之间的 unique_id 表做些什么,尽管我认为这可能需要更新所有查询?希望有一个简单的方法来做到这一点......

4

2 回答 2

2

在数据库中随机化 id 值(将它们从 auto_increment 整数更改为字母数字)并不能真正解决根本问题。

即使您设法随机化和混淆 id 值,用户仍然可以通过 URL 操作访问其他用户的数据。您要做的就是让任何特定的 URL 操作尝试成功返回被禁止的数据“不太可能”。

如果您的应用程序需要阻止某些用户看到某些数据,那么您的应用程序需要提供一个真正的机制来做到这一点。

混淆 ID 值将是一大堆工作,最终,它不会完成真正需要做的事情。

(请参阅 Sabeen Malik、draw010、Justin Swartsel 的评论,他们都“正确”。)


如果您的应用程序已经实现了防止访问禁止数据的机制,则不需要对 ID 值进行混淆。

这些 ID 值真正需要混淆的唯一地方是在 URL(或 POST)中,并且可以在不更改现有数据库的情况下实现。(请参阅 Sabeen Malik 的评论;可以加密/解密发送到浏览器/从浏览器发送的 id 值......如果浏览器中运行的 javascript 取决于 id 值是“可订购的”,则存在的大问题.. .)


我知道这可能不是您在原始问题中寻找的答案。id INT AUTO_INCREMENT但如果没有充分的理由,我不会努力改变价值观。

于 2012-07-16T19:38:25.050 回答
1

如果没有深入了解您的应用程序,这实际上是不可能准确回答的。我可以告诉你的是,一切都可以完成,但这取决于你的代码结构。您使用的是良好的 MVC 布局还是廉价的毯子样式代码?

我真诚地希望你有一个类似 MVC 的系统,你的模型都集中在几个文件中,否则维护起来会变得很糟糕,并确保你得到了应用程序的所有位置。

于 2012-07-16T19:32:47.753 回答