在Postgres中,准备好的查询和用户定义的函数是否等同于防止SQL注入的机制?
一种方法相对于另一种方法是否具有特殊优势?
在Postgres中,准备好的查询和用户定义的函数是否等同于防止SQL注入的机制?
一种方法相对于另一种方法是否具有特殊优势?
Answers:
这取决于。
有了LANGUAGE sql
,答案通常是肯定的。
传递的参数被视为值,并且无法进行SQL注入-只要您不从主体和传递参数中调用不安全的函数即可。
有了LANGUAGE plpgsql
,答案通常是肯定的。
但是,PL / pgSQL允许使用动态SQL,其中将传递的参数(或部分)连接到查询字符串并使用进行执行EXECUTE
。这可以将用户输入转换为SQL代码,并使SQL注入成为可能。您无法从外部判断功能主体是否正确处理了它。提供了工具。
仅在需要时使用动态SQL。使用参数作为值的普通SQL语句可以像SQL函数一样防止SQL注入。
对于动态SQL,最好将值作为值传递给:
USING
条款。实例。使主体无法进行SQL注入。
如果您串联SQL字符串中的值,请使用:
安全地将字符串用单引号引起来,从而避免语法错误和SQL注入。
应使用以下命令将处理参数视为SQL字符串中的标识符:
format()
带有格式说明符%I
。实例。quote_ident()
。实例。regclass
为表名: _tbl::regclass
。实例。在需要的地方将字符串安全地用双引号引起来,从而避免语法错误和SQL注入。
有关:
永远不要仅仅根据用户输入来构建字符串并执行。这包括由用户直接传递或从系统目录中获取的标识符。在构建动态SQL时,必须将所有内容都视为用户输入并安全引用!
在此相关答案中,有关性能的更多信息:
SQL注入基础知识:
类似的考虑也适用于其他允许动态SQL的服务器端语言。
USING
子句将值传递给EXECUTE
。您可以从SQL函数中调用PL / pgSQL函数并传递参数。因此,绝对正确,只要您不直接或间接调用任何不安全的函数,便可以安全。如果所有功能都正确完成,那将不会发生。