【发布时间】:2020-03-27 10:55:20
【问题描述】:
在我们的 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 的有效、安全方法是什么?我应该 MD5 发票 ID 并将其子串,还是依赖 PHP uniqid?
【问题讨论】:
-
MySQL 有自己的 UUID 实现,dev.mysql.com/doc/refman/8.0/en/…
-
人们仍然可以简单地尝试 ID 并获得未经授权的访问。
-
将附加令牌与所请求的 ID 结合使用 更有意义。令牌被注册并与 id 一起分发给客户。组合允许访问,不匹配的组合被拒绝。这提供了基本的保护。
-
默默无闻的安全不是安全。客户不需要登录吗?当然,您可以添加一些简单的授权代码来检查用户是否真的拥有所选发票的权限?
标签: php mysql sql security architecture