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

在Postgres中,准备好的查询用户定义的函数是否等同于防止sql注入的机制?
一种方法比另一种方法有特别的优势吗?
这取决于.

sql函数

使用LANGUAGE sql,答案通常是肯定的.

传递的参数被视为值,并且不能进行sql注入 – 只要您不从主体调用不安全的函数并传递参数.

PL / pgsql函数

对于LANGUAGE plpgsql,答案通常是肯定的.

但是,PL / pgsql允许动态sql,其中传递的参数(或部分)连接到查询字符串并使用EXECUTE执行.这可以将用户输入转换为sql代码并使sql注入成为可能.你不能从外面告诉函数体是否正确处理它.提供工具.

仅在您需要的地方使用动态sql.使用参数作为值的纯sql语句可以安全地防止sql注入,如sql函数.

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

> USING条款. Example.

在主体上无法进行sql注入.

如果在sql字符串中连接值,请使用:

> format() with format specifier %L. Example.
> quote_literal() or quote_nullable(). Example.

安全地包装单引号中的字符串,从而避免语法错误sql注入.

应在sql字符串中作为标识符处理的进程参数:

> format() with format specifier %I. Example.
> quote_ident(). Example.
> a cast to a registered type – 表名的regclass:_tbl :: regclass. Example.

在需要时安全地用双引号括起字符串,从而避免语法错误sql注入.

有关:

> Refactor a PL/pgSQL function to return the output of various SELECT queries
> Define table and column names as arguments in a plpgsql function?

永远不要只是从用户输入和执行构建一个字符串.这包括用户直接传递或从系统目录中提取的标识符.在构建动态sql时,所有必须像用户输入一样对待并安全引用!

更多关于此相关答案中的性能影响:

> Function Performance

sql注入的基础知识:

> http://bobby-tables.com/

类似的注意事项适用于允许动态sql的其他服务器端语言.

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...