参数化视图概览
在 Bigtable 中,您可以使用参数化视图根据应用上下文动态过滤数据 范围,以用于 逻辑视图。这种方法可以保护您的应用免受 SQL 注入的侵害,并减少对多个静态视图的需求。
为了处理敏感信息,Bigtable 参数化视图使用与 SQL 查询文本隔离的上下文。由于数据库在服务器端绑定这些值,因此用户和 AI 代理无法操纵查询参数。无论您如何编写查询,数据库都会自动将数据访问权限限制为您的特定上下文。
参数化视图的优势
参数化视图非常适合在数据库级别管理 数据范围,尤其是在处理从自然语言翻译而来的自由格式查询的应用中。数据范围是将查询结果限制为特定数据子集的过程。这些视图提供了一种灵活的方式来实现以下目标:
- 深层身份传播:在 用户级别强制执行精细的数据权限,确保用户只能访问自己的数据 上下文。例如,应用可以确保用户或租户仅检索其指定边界内的行。
- 简化的用户管理:为所有数据库 用户使用单个数据库角色,而不是为每个用户使用单独的角色。
- 参数隔离:参数化视图通过将 值作为隔离的上下文传递来降低风险,该上下文不受 LLM 或最终用户控制。 由于这些值与查询文本分开,因此生成查询的用户或 AI 代理无法操纵这些值。
- 缓解 SQL 注入:在构建应用时,替换 客户端的参数在查询文本中可能会导致查询 操纵。参数化视图通过在解析查询结构后在服务器端执行参数绑定来缓解此风险。这样可以防止 SQL 注入,因为攻击者控制的值无法更改查询的结构。
例如,假设有一个健康跟踪应用,用于存储患者的医疗记录,包括胆固醇水平。如果患者查询自己的数据,恶意或行为不端的代理可能会生成或请求尝试检索其他患者记录的查询。使用参数化视图,应用会在数据库级别强制执行患者隔离。该视图使用 patient_id 视图参数定义:
CREATE VIEW patient_health_pv AS
(SELECT * FROM patient_health_records WHERE patient_id = CAST(VIEW_PARAMETERS('patient_id') AS BYTES))
当客户端想要查询患者的 cholesterol 读数时:
SELECT readings['value'], readings['date']
FROM patient_health_pv
WHERE readings['test_name'] = 'cholesterol'
由于查询了该视图,Bigtable 会自动绑定并应用来自隔离参数映射的 patient_id 值。LLM
或最终用户无法更改或舍弃此过滤器,从而确保强大的用户级范围限定并消除 SQL 注入向量。
参数化视图的工作原理
参数化视图使用一种称为 视图参数 的机制,将应用级上下文(例如用户 ID)安全地传递给数据库。参数化视图通过将视图参数值作为单独的隔离上下文与查询请求一起传递来实现此目的。然后,Bigtable 可以在查询执行期间访问此上下文,但查询本身无法读取或修改该上下文。
VIEW_PARAMETERS() 函数是用于在视图定义中访问这些参数的 SQL 接口。例如,如需根据发出查询的用户的 ID
过滤数据,您可以在视图的 WHERE 子句中添加以下内容:
CREATE VIEW purchase_history_pv AS
(SELECT * FROM purchases WHERE user_id = CAST(VIEW_PARAMETERS('user_id') AS BYTES))
您还可以使用 VIEW_PARAMETERS() 对列限定符进行参数化。这样,视图就可以根据提供的应用上下文动态返回特定字段。
CREATE VIEW specific_test_result_pv AS
SELECT
tests[VIEW_PARAMETERS('test_name')] AS reading,
_timestamp AS reading_time
FROM patients
与标准查询参数的区别
视图参数的运作方式与标准查询参数不同:
- 语法和上下文:标准查询参数使用
@param语法定义,并且无法在视图定义中声明,只能在查询中声明。视图 参数使用VIEW_PARAMETERS('key')函数访问,该函数可以在任何查询或视图上下文中调用 。 - 故障关闭行为:如果查询包含
VIEW_PARAMETERS('key')引用 的视图定义,但在请求的视图 参数映射中未提供相应的值,则查询会立即失败,并显示not found / missing parameter错误。 如果配置应用不当,这样可以防止意外的数据暴露。
限制
参数化视图存在以下限制:
- 您只能从逻辑视图创建参数化视图。您可以使用 Google Cloud CLI 创建新的参数化逻辑视图。您无法修改现有逻辑视图。
- 视图参数仅支持字符串类型的值。如果参数
在视图的 SQL 定义中表示不同的数据类型,您必须
将参数值作为字符串传递,并在视图
定义中进行转换,例如
CAST(VIEW_PARAMETERS('parameter_name') AS INT64)。