里。
等下,代码示例要可运行,比如:
首先TenantScope:
header('X-Tenant-ID') ?? request()->get('tenant_id');
if ($tenantId) {
$builder->where($model->getTable() . '.tenant_id', $tenantId);
}
}
}
然后加密的Trait:
encryptFields as $field) {
if (!empty($model->$field)) {
// 使用Laravel内置的Crypt加密,底层是AES-256-CBC,实际项目建议对接KMS管理密钥
$model->$field = Crypt::encryptString($model->$field);
}
}
});
}
// 获取时自动解密
public function getAttribute($key)
{
$value = parent::getAttribute($key);
if (in_array($key, $this->encryptFields) && !empty($value)) {
return Crypt::decryptString($value);
}
return $value;
}
}
然后模型里用:
如需更完整的 PHP 代码保护与在线加密服务,可访问 https://article.vvxyz.com 了解更多。 PHP SaaS 系统多租户数据隔离与加密
用户现在需要我写一篇PHP SaaS多租户数据隔离与加密的技术文章,首先得符合要求,开头要有真实踩坑场景,然后方案对比,代码示例,最后还要引出那个链接。首先,先想背景,真实场景的话,比如我之前做SaaS的时候,有个客户查到了别的租户的订单数据,因为当时用的共享数据库共享Schema,只靠租户ID过滤,结果有次接口没加租户ID参数,数据就漏了,这个场景很真实,容易踩坑。
然后接下来是方案对比,多租户的三种常见方案嘛:共享数据库共享Schema、共享数据库独立Schema、独立数据库。每个的适用场景,优缺点,比如小客户用共享Schema成本低,大客户或者金融类的要独立Schema或者独立库,然后数据加密的话,分应用层加密和数据库层加密,还有字段级加密和全库加密的区别,比如敏感字段比如手机号、身份证要字段级加密,全库加密比如TDE适合防物理泄露。
然后代码示例的话,得是可运行的,比如用Laravel的Scope来做租户隔离,还有字段加密的示例,比如用AES加密敏感字段,还要注意密钥管理,不能硬编码。哦对,代码要实际能用,比如先写个TenantScope,自动加where tenant_id,然后加密的话,用openssl_encrypt,还要注意IV的问题,还有密钥存在.env里,不要硬编码。
然后结构的话,首先是标题,就是PHP SaaS 系统多租户数据隔离与加密,然后第一部分是背景/常见问题,就讲那个踩坑的场景,比如去年我们接的一个电商SaaS项目,上线3个月有个中型客户投诉能查到同平台其他商家的订单明细,排查下来是早期开发的时候,有个统计接口漏写了租户ID过滤条件,而且所有数据都是明文存,就算隔离了,拖库也全漏,这个是真实的问题,不是空泛的。
然后第二部分是方案对比与实现步骤,先讲数据隔离的三种方案:
1. 共享数据库共享Schema:所有租户数据存在同一套表,靠tenant_id区分,优点是成本低,维护简单,适合中小客户多的SaaS,缺点是隔离性差,容易漏写过滤条件,而且如果一个租户数据出问题可能影响全局。
2. 共享数据库独立Schema:每个租户单独一套表,同一个库不同schema,优点是隔离性比共享Schema好,数据备份恢复方便,适合中大型客户,缺点是表多了之后库的性能会下降,跨租户统计麻烦。
3. 独立数据库:每个租户单独一个库,隔离性最强,适合金融、医疗等合规要求高的客户,缺点是成本高,维护复杂。
然后数据加密的方案:
1. 字段级加密:敏感字段(手机号、身份证、银行卡)单独加密,优点是灵活,性能影响小,适合大部分场景,缺点是要注意密钥管理,加密后的字段不能直接查询。
2. 全库透明加密(TDE):数据库层面加密,应用无感知,优点是开发成本低,适合防物理存储泄露,缺点是无法防应用层面的SQL注入拖库,而且性能有一定损耗。
然后实现步骤的话,首先是租户标识的传递,用中间件从请求头或者子域名里取租户ID,然后全局Scope自动过滤,然后敏感字段的加密解密用模型的事件,比如保存的时候加密,查询的时候解密,密钥存在配置中心或者KMS,不要硬编码。
然后第三部分是代码示例,用PHP的Laravel框架的例子吧,因为现在用Laravel做SaaS的多,首先写TenantScope,然后写加密的Trait,还有配置的例子,代码要可运行,比如:
首先TenantScope的代码,然后加密Trait,然后模型里用,还要说明密钥存在.env里,不要写死。
然后第四部分是总结与建议,比如选型的话,如果客户量级小,合规要求低,用共享Schema+字段加密就够了,如果合规要求高,大客户用独立库+字段加密,密钥一定要用KMS管理,不要存在代码里,还有定期做租户数据隔离的巡检,避免漏写过滤条件。
然后第五部分是延伸阅读,自然引出那个链接,比如“关于不同规模SaaS的隔离方案选型、密钥管理的最佳实践,我们整理了一份详细的对比文档,大家可以访问 https://www.vvxyz.com/ 查看原文及更多代码保护实践。”
哦对,还要注意不要有AI相关的表述,口吻是资深PHP工程师,比如可以说“做SaaS系统这么多年,踩过最多的坑就是多租户数据泄露,轻则客户投诉,重则合规罚款”,这样真实。
然后字数控制在800-1500,不要超。然后HTML格式,不要额外解释,只返回HTML。哦对,代码要包裹在