在没有前缀的情况下调用pg_temp模式中的函数

时间:2016-07-12 13:12:22

标签: postgresql postgresql-9.4

在postgres中,pg_temp架构默认位于搜索路径上。 正如Tom pg_temp模式中所解释的那样,pg_temp模式中的函数默认情况下不可调用,出于安全原因没有前缀。

但是他声明,为了在没有前缀的情况下调用set search_path to pg_temp,public; -- create function in the temp schema create function test_fun() returns int as $$ select 1; $$ language sql; -- results in "function test_fun() does not exist" select test_fun(); -- works perfectly select pg_temp.test_fun(); 模式中的函数,您必须将临时模式显式添加到搜索路径中。不幸的是,从postgresql 9.4开始,这似乎不再适用了。

All Rows .. VerticalLayoutGroup, ContentSizeFitter
(EXPAND MUST BE "OFF")
(MUST BE HORIZONTAL >>UNCONSTRAINED<<, VERT PREFERRED)
 One Row ... HorizontalLayoutGroup, ContentSizeFitter  ** CFO OFF!
 (EXPAND MUST BE "OFF")
 (MUST BE HORIZONTAL PREFERRED, VERT PREFERRED)
  One Unit .... HorizontalLayoutGroup, ContentSizeFitter   **CFO ON!
  (EXPAND MUST BE "ON")
  (MUST BE HORIZONTAL PREFERRED, VERT PREFERRED)
    Text on the left (inherently sizes in Unity)
    The UI.Button ..... LayoutElement: choose and set "Min" Width/Height
      Text below button ...... nothing (probably won't need this)
 Another row...
 Another row...

 CFE means ChildForceExpand button, set correctly as shown!
 For all three ContentSizeFitters, select "Preferred" both ways

有没有办法在pg_temp模式中调用函数而不加前缀?

这对于开发新功能非常方便。

1 个答案:

答案 0 :(得分:3)

看起来Tome Lane在那一个上并不是100%精确 - 我从9.2检查到9.5,并且在每个中你需要使用pg_temp来限定函数。设置search_path是不够的。

请参阅PostgreSQL提交aa27977fe21a7dfa4da4376ad66ae37cb8f0d0b5

  

支持在search_path中显式放置临时表模式。   这是允许安全定义器功能设置真正安全所必需的   search_path的值。没有它,恶意用户可以使用临时对象   使用security-definer函数的特权执行代码。甚至   将临时模式推送到搜索路径的后面并不是很好   因为路径后面的函数或运算符可能仍然存在   由于具有更精确的数据类型,从较靠近前方捕获控制   比赛。因此,禁用为函数和完全搜索临时模式   运算符。

     

安全:CVE-2007-2138

特别参见FuncnameGetCandidates

中的更改
@@ -549,12 +586,16 @@ FuncnameGetCandidates(List *names, int nargs)
        }
        else
        {
-           /* Consider only procs that are in the search path */
+           /*
+            * Consider only procs that are in the search path and are not
+            * in the temp namespace.
+            */
            ListCell   *nsp;

            foreach(nsp, activeSearchPath)
            {
-               if (procform->pronamespace == lfirst_oid(nsp))
+               if (procform->pronamespace == lfirst_oid(nsp) &&
+                   procform->pronamespace != myTempNamespace)
                    break;
                pathpos++;
            }