2011-04-11 24 views
0

我有一个简单的消息传递系统。在PHP中编码,MySQL和Java可能会实现。现在我想确保收件人的ID。目前我使用用户表的自动增量主键(1,2,3)。但这当然是不安全的。因为每个人都可以猜测,所有其他ID都从1到xxx计数。那么确保身份证的最佳商业实践是什么?在MD5中转换它(也许用一些密码文本“myencryptionkey”+ userId - > MD5)? 如果收件人ID很容易重现,垃圾邮件发送者将使用此系统用于他们的目的。BBP:如何在邮件系统中保护数据库ID?

我认为这是一个普遍的问题。以及“友谊邀请”。如果每个人都能猜到,如何构建ID,则可以发送大量的友谊邀请。

另一个想法: 什么是关于用随机创建的密钥加密userIds。我生成一个随机密钥,将它存储在会话cookie中。所以每个人都有一个用户123的其他标识符。所以我需要一个函数来加密和解密一个给定的整数。

如何像Facebook PROTEC其主键的网页?

回答

0

我只看到了问题,如果你的系统有漏洞,让人们利用你的标识符,虽然我理解的关注,它已经跨越了我的脑海里偶尔,为此我可能会建议,虽然不一定是的支持者,对每个唯一密钥使用GUID

这些可以是自动生成的上的记录插入,和消除可猜测因子。

他们还扩大了规模相当显著,我会说,相较于一个整数 - 这是有问题的依赖于规模和系统的其他领域。

+0

用GUID表示PHP函数:** uniqid()**? – brill 2011-04-11 12:10:05

+0

当然,MySQL支持在字段上自动生成GUID作为标识,你不需要自己生成和插入这些GUID。 – 2011-04-11 12:14:39

+0

使用GUID时,请将GUID => ID映射保留在单独的表中,并使用数字ID保留在所有其他表中。这可以确保只有最小的性能损失(查找GUID => ID的时间),而不必在每次访问混淆主键时都要执行基于字符串的查找。 – ThiefMaster 2011-04-11 12:50:26

1

ID通常是可预测的。这不是问题。

,使它们不预测的本质,你做的ID的秘密。无论谁知道秘密都可以访问。这被称为security by obscurity,并且在所有处都不是安全的

如果你想限制访问,你应该把一些访问控制措施到位。例如,让用户根据其userId /角色登录并提供查看权限。

+0

你说得对。我将阻止该用户将消息写入其他用途,这些用户不在好友列表中。所以如果有人操纵接收者ID,消息将不会被发送。 Bacuase被操纵的userid不是一种freindship关系,好的。但是邀请是什么?当然,非常可以向任何人发送友谊邀请。也许消息传递试验不是最好的。如何防止垃圾邮件发送者/黑客可以猜测ID并发送大量邀请?在我看来,这可以通过加密ID来完成。 – brill 2011-04-11 13:15:16

+0

@brill 然后,我会建议只添加到常规的数字ID和用户的名字(仅用于链接到他们的个人资料),如'example.com/profile/123slava'。你不会通过加密使它更安全,你只会失去表现。用户的名字/姓氏将是普通主键的密码,对普通用户来说最不方便,而且在处理混淆的ID时不会出现性能损失。 – Slava 2011-04-11 13:26:10