安全注意事项
适用于 ❌ 开源版 ✅ Express 版 ✅ 专业版 ✅ 企业版
虽然策略是实现行级别安全的好方法,但请注意,在客户端而不是服务器端实现此功能存在一些重大限制。如果可以,请考虑同时(额外)使用任何供应商特定的策略实现,例如:
- Oracle 的 Virtual Private Database 功能
- PostgreSQL 的
POLICY
功能 - 任何基于视图和上下文变量的自定义实现
jOOQ 实现的一些具体限制包括
- 策略仅适用于 jOOQ 表达式树。它们不适用于纯 SQL 模板,这对于 jOOQ 是“不透明的”。您可以使用编译时检查器来防止大多数意外的纯 SQL 模板使用,但是这些也可以很容易地被规避。对于视图和存储函数来说尤其如此,策略不会自动应用于它们。
- 任何有权访问您的 JDBC 驱动程序的人都可以直接针对 JDBC 运行查询,并且 jOOQ 不会知道这些查询。
- 任何有权访问您的配置的人都可以删除
org.jooq.PolicyProvider
,并再次针对您的模式运行不受限制的查询。 - 策略不会阻止执行语句类型,包括DDL 语句。为此,请使用(服务器端)权限。
- 虽然策略可能能够访问来自列DEFAULTs或计算列表达式的表达式,但策略无法访问触发器逻辑或任何将与您的 DML 语句交互的其他逻辑,因此,触发器可能会生成一个策略不允许的值。这对于IDENTITY值或任何其他从具有副作用的表达式生成的值也是如此,这些副作用在
INSERT
语句之前无法预测。 - 虽然 jOOQ 将阻止访问策略范围之外的数据,但总是有办法从次要影响中推断数据,例如基于某些谓词的执行时间来检查数据的存在或不存在的基于时间的搜索。
正如上面的列表所示,虽然 jOOQ 的POLICY
功能确实提供了很多价值,但期望它为您的应用程序提供非常高的安全性是不明智的。安全最佳实践应该应用于应用程序的每一层,包括数据库、查询层、服务层和 UI 中。
另请参阅此处其他代码生成功能的限制。
反馈
您对此页面有任何反馈吗? 我们很乐意听到您的反馈!