Php BBP:如何在消息传递系统中保护数据库ID?

Php BBP:如何在消息传递系统中保护数据库ID?,php,mysql,security,Php,Mysql,Security,我有一个简单的信息系统。用PHP、MySQL编码,可能会实现Java。现在我想保护收件人的ID。目前,我使用用户表的自动递增主键(1、2、3)。但这当然是无法治愈的。因为每个人都可以通过从1到xxx的计数来猜测所有其他ID。那么,保护id的最佳业务实践是什么呢?在MD5中转换它(可能使用一些密码文本“myencryptionkey”+用户id-->MD5)? 如果收件人id易于复制,垃圾邮件发送者将使用此系统 我认为这是一个普遍的问题。以及“友谊邀请”。如果每个人都能猜到ID是如何构造的,那么你

我有一个简单的信息系统。用PHP、MySQL编码,可能会实现Java。现在我想保护收件人的ID。目前,我使用用户表的自动递增主键(1、2、3)。但这当然是无法治愈的。因为每个人都可以通过从1到xxx的计数来猜测所有其他ID。那么,保护id的最佳业务实践是什么呢?在MD5中转换它(可能使用一些密码文本“myencryptionkey”+用户id-->MD5)? 如果收件人id易于复制,垃圾邮件发送者将使用此系统

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

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


像facebook这样的页面是如何保护其主键的?

我只会在您的系统存在漏洞,允许人们利用您的标识符的情况下才看到问题,尽管我理解这一担忧,有时我也会想到这一点,出于这个原因,我可能会建议,尽管不一定是您的支持者,对每个唯一键使用
GUID

这些可以在插入记录时自动生成,并消除可猜测性因素


我想说,与整数相比,它们确实会显著地扩展大小——这是有问题的,取决于系统的规模和其他方面。

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

通过使它们不可预测,本质上就是使ID成为一个秘密。任何知道这个秘密的人都可以进入。这就是所谓的,根本不安全


如果你想限制访问,你应该采取一些访问控制措施。例如,允许用户登录并根据其用户ID/角色授予查看权限。

MySQL当然支持在字段上自动生成GUID作为标识,您根本不需要自己生成和插入这些GUID。使用GUID时,将GUID=>ID映射保留在单独的表中,并在所有其他表中保留数字ID。这样可以确保您的性能损失最小(查找GUID=>ID的时间),而不必每次访问模糊主键时都进行基于字符串的查找。@ThiefMaster:这只是冗余。您的回答是对的。我将阻止该用户将消息写入好友列表之外的其他用途。因此,如果有人操纵接收者id,消息将不会被发送。B因为被操纵的用户ID不在freindship关系中,ok。但是什么是邀请呢?当然,verybod必须能够向其他任何人发送友谊邀请。也许消息传递示例不是最简单的。如何防止垃圾邮件发送者/黑客猜测ids发送大量邀请?在我看来,这可以通过加密ID来实现。@brill然后我建议只在常规数字ID中添加用户名(仅用于链接到其配置文件),如
example.com/profile/123slava
。加密不会使它更安全,只会降低性能。用户的名字/姓氏将是一种普通主键的密码,对于普通用户来说不方便,并且在处理模糊ID时不会造成性能损失。