在我们的CRM中,我们有一个PHP页面,给定6位数的发票ID(例如314529(,从数据库中获取产品行和总数,并打印发票。
为了实施一些智能工作措施,我们现在已经公开了这个发票生成页面,因此我们可以通过电子邮件向客户发送发票链接,例如https://example.com/get-invoice.php?id=314529
问题是,发票ID是渐进的,因此任何客户都可以通过增加编号来访问任何其他客户的发票。
我的想法是生成一个随机的UUID,并将其映射到我们数据库中的实际发票编号,这样客户就无法"猜测"其他人的发票。
CREATE TABLE email_invoice (
public_uuid VARCHAR(128) UNIQUE,
actual_order_id INT
);
实现这个唯一ID的有效、安全的方法是什么?我应该对发票ID和子字符串进行MD5,还是依赖PHPuniqid
?
作为入门:您应该管理应用程序中的授权层;每个用户在尝试访问存储的数据时都应该经过身份验证并检查访问权限。
话虽如此,在此基础上添加一些淫秽内容也不是坏事。您的用例看起来是使用UUID()
或UUID_SHORT()
的好地方。
这些函数产生了独特的、不可预测的标识符,而这些标识符似乎正是您想要的。您可以只使用UUID列,而不是主键的。
缺点是计算一个自动递增的键的成本更高,并且在insert
查询中没有生成默认值的选项。
create table email_invoice (
id varchar(36) primary key,
email_id int,
invoice_id int
);
insert into email_invoice(id, email_id, invoice_id) values(uuid(), 1, 2);
DB Fiddle上的演示:
id|email_id|invoice_id:--------------------------------------------|-------:|--------:b86d0d8b-7022-1ea-8095-00163e561f6d|1|2
您还可以创建一个before
触发器,为每个插入分配一个uuid()
,因此您不必担心在语句本身中调用函数。
在web请求中对客户端进行身份验证,并在给出结果之前验证它们是否已通过身份验证。
您所拥有的是一个不安全的直接对象引用。有很多方法可以防止这种情况。
建议获得一些网络安全专业知识到你的CRM的发展,因为这是一个相当基本的错误。