在不影响应用程序的情况下“更改”MySQL中的所有现有和新行ID

时间:2012-07-16 19:22:16

标签: php mysql php-5.3

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

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

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

我的想法是手动更新我的所有表格,但这也需要更换每个插页?我可以用一个介于两者之间的unique_id表做一些事情我想这可能需要更新所有查询吗?希望有一个简单的方法来做到这一点...

2 个答案:

答案 0 :(得分:2)

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

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

如果您的应用需要阻止某些用户查看某些数据,那么您的应用需要提供真正的机制来实现这一目标。

模糊ID值将是一大堆工作,最终,它无法实现真正需要完成的工作。

(参见Sabeen Malik的评论,drew010,Justin Swartsel,他们都“正确”。)


如果您的应用程序已经实现了阻止访问禁止数据的机制,则无需对ID值进行模糊处理。

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


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

答案 1 :(得分:1)

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

我真诚地希望你有一个类似MVC的系统,你的模型都集中在一些文件中,或者它将变得很难维护,并确保你得到应用程序的所有位置。