使用LANGUAGE sql
,答案通常是肯定的.
传递的参数被视为值,并且不能进行sql注入 – 只要您不从主体调用不安全的函数并传递参数.
对于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字符串中作为标识符处理的进程参数:
> 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时,所有必须像用户输入一样对待并安全引用!
更多关于此相关答案中的性能影响:
sql注入的基础知识:
类似的注意事项适用于允许动态sql的其他服务器端语言.
原文地址:https://www.jb51.cc/postgresql/192420.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。