CREATE FUNCTION后面的代码是字符串意味着什么?

时间:2018-06-15 01:17:45

标签: sql postgresql sql-injection

来自a great reply

  在PostgreSQL中,CREATE FUNCTION确实是一个“SQL语句”,但它只是一个   “wrapper”指定由某个东西执行的代码块   不同于SQL查询“引擎”。 Postgres(与其他DBMS不同)   支持可以执行代码块的多个“运行时引擎”   传递给“CREATE FUNCTION”语句 - 一个神器   那就是代码实际上是一个字符串所以只有CREATE FUNCTION   看到一个字符串,没有别的。

“代码实际上是一个字符串,因此CREATE FUNCTION只能看到一个字符串,没有别的”后果是什么?

这被视为动态SQL吗?与动态SQL相比,它是否会阻止或引入SQL注入风险?

与其他“代码不是字符串”的RDBMS(如果有的话)有何不同?

感谢。

2 个答案:

答案 0 :(得分:1)

所有3GL +代码基本上都是一个字符串。 "参数"传递给CREATE FUNCTION的是代码(将在核心SQL引擎上执行),这是一个字符串( SQL

SQL)。

其他RDMS仅支持SQL作为函数/过程体。

答案 1 :(得分:1)

PostgreSQL具有高度可扩展性,您可以定义自己的过程语言来编写函数。

PostgreSQL对该语言一无所知,只是它必须调用某个语言处理程序才能执行该函数。

选择实现此目的的方法是简化将代码作为字符串传递。

这只是一个实现细节,并不会使PostgreSQL函数比其他RDBMS更容易受到SQL注入攻击。

您需要在几个级别上保护自己免受注射:

  • 函数参数:这里应尽可能选择非字符串数据类型。

  • 函数中的SQL语句:这里应尽可能避免使用动态SQL,如果必须使用动态SQL,则应使用%L format模式插入变量功能

同样,如果将函数体指定为字符串,则这是相同的。