从安全角度看,以下策略的实现是否等效?
隐含:
CREATE POLICY test_access_policy ON test
TO PUBLIC
USING (id = (current_setting('rls.id'::TEXT)))
WITH CHECK (TRUE);明确:
CREATE POLICY test_insert_policy ON test
FOR INSERT TO PUBLIC
WITH CHECK (TRUE);
CREATE POLICY test_select_policy ON test
FOR SELECT TO PUBLIC
USING (id = (current_setting('rls.id'::TEXT)));
CREATE POLICY test_update_policy ON test
FOR UPDATE TO PUBLIC
USING (id = (current_setting('rls.id'::TEXT)));
CREATE POLICY test_delete_policy ON test
FOR DELETE TO PUBLIC
USING (id = (current_setting('rls.id'::TEXT)));我关心的是更新策略,如文档中所述
更新后的值不通过WITH CHECK表达式的任何行都将导致错误,整个命令将被中止。如果只指定了USING子句,那么该子句将用于USING和WITH。
据我理解,隐式版本(oneliner)的等效更新策略如下:
CREATE POLICY test_update_policy ON test
FOR UPDATE TO PUBLIC
USING (id = (current_setting('rls.id'::TEXT))) WITH CHECK (TRUE);而明确的版本是:
CREATE POLICY test_update_policy ON test
FOR UPDATE TO PUBLIC
USING (id = (current_setting('rls.id'::TEXT))) WITH CHECK (id =
(current_setting('rls.id'::TEXT)));在测试了这两种情况后,我没有发现任何安全桥,是不是遗漏了什么?
发布于 2021-11-18 10:11:45
您的解释是正确的,您必须将WITH CHECK (TRUE)添加到FOR UPDATE策略中,才能有一个等效的定义。
不同之处在于,WITH CHECK (TRUE)允许您将值更改为任何值,如果新的行版本与条件不匹配,如果没有它,您将收到一个错误。
https://stackoverflow.com/questions/70017648
复制相似问题