2015-04-06 41 views
1

我试图创建的PostgreSQL 9.3.6一个PL/pgSQL函数,但使用内部函数体中传递的参数时,怪异的行为。这里是 '非常简单' 的功能:函数参数不解释体内

CREATE OR REPLACE FUNCTION myschema.test (myarg text) RETURNS text AS $$ 
DECLARE 
    entity text; 
    buffer text; 
BEGIN 
    CREATE ROLE myarg; 
    RETURN myarg; 
END; 
$$ LANGUAGE plpgsql; 

所以,如果例如myarg等于 '测试':

  • 名为 'myarg' 角色创建(错误的)
  • '测试' (正确)

我搜索了几个小时,为什么这可能是和没有线索......安全参数?为什么myarg不能解释为创建角色?

测试与phpPgAdmin的通过SQL文件,如果这有任何影响。

回答

1

你应该使用:

EXECUTE FORMAT('CREATE ROLE %I', myarg); 

Here you can find an explanation(尤其是阅读克雷格的答案)。


正如Erwin所说(谢谢),%I比%s更安全。无论如何,myarg应在函数调用之前进行验证。尝试举例

SELECT myschema.test('something; stupid; here;') 
+0

请务必在此上下文(角色名称)中将'myarg'作为标识符进行转义,或者您已经开放给SQL注入。除非已经安全地转义了标识符,否则使用'%I'格式()。 http://stackoverflow.com/questions/10705616/table-name-as-a-postgresql-function-parameter/10711349#10711349 – 2015-04-06 11:54:17