我刚刚在两个 RDS PostgreSQL 9.3 数据库中发现了以下函数:
--
-- Name: exec(text); Type: FUNCTION; Schema: public; Owner: adam
--
CREATE FUNCTION exec(text) RETURNS text
LANGUAGE plpgsql
AS $_$ BEGIN EXECUTE $1; RETURN $1; END; $_$;
ALTER FUNCTION public.exec(text) OWNER TO adam;
我很确定我没有写这个函数,因为exec
它看起来像一个安全隐患(它只是执行命令吗?)它想知道它的全部内容。搜索方法签名对我没有帮助。
这个函数有什么作用?
这是某种安全风险吗?
哪个程序/框架可能创建了它?
这是一个执行任意 SQL 的完全无意义的函数。并非
SECURITY DEFINER
如此,我认为它可能带来的唯一风险是,如果您允许用户运行任意 SQL 谓词或调用任意函数(在这种情况下,您可能已经被塞满了),但试图阻止他们运行他们想要的任何命令。如您所料,它只是使用 PL/PgSQL 的动态 SQL 工具执行 SQL 输入。
哦,它还会从简单
log_statement
分析auto_explain
等中隐藏语句文本,因为它们只查看顶级语句,而不是通过 PL/pgSQL 运行的语句。就个人而言,我会删除/重命名它,看看有什么抱怨。