RLS策略定义在运行时是否受搜索路径的影响?



在回答这个问题时,我给出了一些(没有根据的)建议

create policy test_policy on policy for all to public using (
user_id = session_user_id());

顺便说一句,您应该对session_user_id()调用进行模式限定,以使您的策略真正安全,这样用户就不能通过search_path注入自己的session_user_id函数。

但事实是这样吗?我把SECURITY DEFINER函数的search_path问题记错了。

如何以及何时解析行级安全策略?在定义或求值期间是否解决了引用?

让它们中的标识符是早绑定而不是晚绑定是有意义的,但我在文档中找不到任何关于这一点的内容。

策略定义存储在pg_policy中,USING子句存储在polqual列中,WITH CHECK表达式存储在polwithcheck中。

两个列的数据类型为pg_node_tree,这是一个已解析的SQL语句。因此,策略在创建时解析,而不是在执行时解析,这很像视图或符合标准的SQL函数(v14中的新功能)。这意味着search_path的设置只在创建策略时相关,而在执行策略时无关。

最新更新