我有下表:
Create table `webservice`(
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`hostname` text NOT NULL,
`portalid` int NOT NULL,
`serviceid` int NOT NULL,
`customerid` int,
primary key (`id`)
)
Run Code Online (Sandbox Code Playgroud)
我有多个客户使用不同的 FQDN 但相同的 DOCROOT 和 MySQL 登录访问多个门户和服务。它是多租户应用程序。
现在我希望每个访问者只能查看他有权查看的数据。所有这些用户都使用单个 MySQL 连接登录。
在第一次连接时,浏览器正在请求 FQDN,因此它应该授予查看关联的“portalid”行的权限。因此,在不知道 FQDN 的情况下,无法访问具有不同 portalid 的行。
当用户登录时,他的视图应该被限制为只有他自己的customerid 的记录。
我不知道该怎么做,但我想我可以在 SQL 中使用会话数据,这将允许获取所需的数据。但是我目前不知道如何设置。
我有这样的会话:https : //security.stackexchange.com/questions/17318/how-to-secure-mysql-based-web-session-data-table
小智 5
最简单的答案可能是:给每个门户一个不同的 MySQL 数据库,使用不同的登录名和密码。
下一个最简单的答案是:将每个门户的内容放在一个单独的表中。仔细检查您的代码以确保每个门户只能访问自己表中的数据。
如果您不想更改数据库架构,实用的答案是:当门户应用程序的代码设置 MySQL 连接时,它应该做的第一件事就是创建一个视图。定义视图,使其仅提供对与该特定门户关联的数据子集的访问。您可以使用带有表单的 WHERE 子句的 SQL 语句定义视图WHERE portalid = xxx
(将 xxx 替换为当前运行的门户的 ID)。例如,
CREATE VIEW webserviceview
AS
SELECT *
FROM webservice
WHERE portalid = xxx
Run Code Online (Sandbox Code Playgroud)
(用当前运行的门户填写xxx)。现在确保您的所有代码只访问webserviceview
而不webservice
直接访问表。
当用户登录时,您可以使用相同的想法进一步限制访问。创建一个仅包含当前登录用户数据的视图。例如,
CREATE VIEW currentuser
AS
SELECT *
FROM webserviceview
WHERE customerid = yyy
Run Code Online (Sandbox Code Playgroud)
然后确保您的代码只访问该currentuser
表,而不是webservice
orwebserviceview
表。
如果您想阅读一些将这种想法更进一步的研究论文,请查看以下论文:
Diesel:将权限分离应用于数据库访问,ASIACCS 2011。
CLAMP:大规模数据泄漏的实际预防,IEEE 安全与隐私 2009。
Nemesis:防止 Web 应用程序中的身份验证和访问控制漏洞,Usenix Security 2009。
归档时间: |
|
查看次数: |
2154 次 |
最近记录: |