存储过程可以防止 PostgreSQL 中的 SQL 注入吗?

信息安全 应用安全 sql注入 数据库 PostgreSQL
2021-09-04 16:28:33

存储过程是否会阻止数据库被注入?我做了一些研究,发现如果我们只使用存储过程,SQL-Server、Oracle 和 MySQL 对 SQL 注入是不安全的。但是,这个问题在 PostgreSQL 中不存在。PostgreSQL 核心中的存储过程实现是否会阻止它进行 SQL 注入,或者还有其他原因/差异吗?如果我们只使用存储过程,我可以在 PostgreSQL 中使用 SQL 注入吗?

4个回答

简而言之 - 不,存储过程不会阻止 SQL 注入。这取决于您如何处理存储过程中的动态 SQL。

有关更完整的答案,请查看此处发布的内容:https ://stackoverflow.com/questions/627918/am-i-safe-against-sql-injection

检查这些链接,图片会更清晰:

http://anubhavg.wordpress.com/2008/02/01/are-stored-procedures-safe-against-sql-injection/

http://www.sqlmag.com/article/sql-server/protecting-against-sql-injection.aspx

"...避免SQL注入的措施

  1. 验证来自服务器上用户的所有输入。
  2. 如果有替代方法可用,请避免使用动态 SQL 查询。
  3. 使用带有嵌入式参数的参数化存储过程。
  4. 使用安全接口执行存储过程,例如 JDBC 中的 Callable 语句或 ADO 中的 CommandObject。
  5. 使用低权限帐户运行数据库。
  6. 为应用程序中使用的存储过程赋予适当的角色和权限。”

如果您正确使用 SP,那么您就可以免受SQL 注入的影响(当然,假设您仍然进行了正确的输入验证)。如果

啊,但是正确使用SP是什么意思呢?

我经常看到的两种最常见的 SP 误用,即使使用存储过程也可能导致 SQL 注入,它们是:

  • SP 内部的动态 SQL。
  • 从代码中调用 SP,就像执行串联字符串一样。即只是发送到数据库“exec spname (param1)”,而不是使用命令/参数对象(或参数化查询,取决于语言)。SQLi 仍然可以注入到 SP 调用中......

无论查询是否为存储过程,都需要变量绑定和命名参数。还需要担心某些 SQL 语句,例如:LIKE