Postgres函数中的SQL注入与准备好的查询


Answers:


36

这取决于。

SQL函数

有了LANGUAGE sql,答案通常是肯定的

传递的参数被视为值,并且无法进行SQL注入-只要您不从主体和传递参数中调用不安全的函数即可

PL / pgSQL函数

有了LANGUAGE plpgsql,答案通常是肯定的

但是,PL / pgSQL允许使用动态SQL,其中将传递的参数(或部分)连接到查询字符串并使用进行执行EXECUTE。这可以将用户输入转换为SQL代码,并使SQL注入成为可能。您无法从外部判断功能主体是否正确处理了它。提供了工具。

仅在需要时使用动态SQL。使用参数作为值的普通SQL语句可以像SQL函数一样防止SQL注入。

对于动态SQL,最好将作为值传递给:

使主体无法进行SQL注入。

如果您串联SQL字符串中的,请使用:

安全地将字符串用单引号引起来,从而避免语法错误和SQL注入。

应使用以下命令将处理参数视为SQL字符串中的标识符

在需要的地方将字符串安全地用双引号引起,从而避免语法错误和SQL注入。

有关:

永远不要仅仅根据用户输入来构建字符串并执行。这包括由用户直接传递或从系统目录中获取的标识符。在构建动态SQL时,必须将所有内容都视为用户输入并安全引用!

在此相关答案中,有关性能的更多信息:

SQL注入基础知识:

类似的考虑也适用于其他允许动态SQL的服务器端语言


因此,总而言之:如果1)我仅使用语言sql,则很安全; 2)如果我使用plpgslq但未执行,则很安全; 3)如果我使用plpgsql并执行但没有标识符和%s或% L是适当的,我很安全,或者4)如果我使用plpgsql并执行和标识符,但%I或quote_ident则我是安全的。正确?
mickeyf_supports_Monica

@mickeyf:基本上是。另外,尽可能使用USING子句将值传递给EXECUTE。您可以从SQL函数中调用PL / pgSQL函数并传递参数。因此,绝对正确,只要您不直接或间接调用任何不安全的函数,便可以安全。如果所有功能都正确完成,那将不会发生。
Erwin Brandstetter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.