postgresql - 我可以通过将 SQL 封装在 PostgreSQL 函数中来防止 SQL 注入(inject)攻击吗?

标签 postgresql security sql-injection quoting

我可以使用这样的函数

CREATE FUNCTION create_user(_firstName text)
RETURNS void AS $$
  INSERT INTO user_account (first_name) VALUES (_firstName);
$$ LANGUAGE sql;

在服务器上防范SQL注入(inject)攻击?然后我就可以在客户端上运行它,

client.query(`SELECT create_user(${someUserInput})...`

或者我仍然需要使用 parameterized queries with placeholders,

client.query(`SELECT create_user($1)`, [someUserInput])

最佳答案

问题(利用)

client.query(`select create_user(${someUserInput})`

问题是如果发生什么

let someUserInput = `'foo'); DROP DATABASE bar;`;

这将被发送到您的调用,

client.query("select create_user('foo'); DROP DATABASE bar;")`

而且,那会很糟糕。是的,create_user 的参数受到了注入(inject)保护,但对其的调用却没有。

解决方案

  1. 使用占位符(显而易见的选择:最安全的解决方案。)
  2. 确保 someUserInput 被正确引用

    1. 使用客户端库引用它,如 PQescapeLiteral
    2. 使用第二次运行服务器来引用它 quote_literal (无论如何都需要占位符)。 选择 quote_literal($1);

我不会尝试自己创建引用机制。

关于postgresql - 我可以通过将 SQL 封装在 PostgreSQL 函数中来防止 SQL 注入(inject)攻击吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48013801/

相关文章:

postgresql - 可成像类型未设置多态关联

node.js - Node.js 的 stripe api 的 token 和安全性 (stripe-node)

c# - 如何以编程方式更改 WMI 的设置而不是使用 wmimgmt.msc snappin?

php - 由于不安全地使用不带引号的 addslashes(),用户输入到达敏感接收器

Django 创建唯一函数索引

postgresql - 如何查找从 db.Query postgres 返回的行数

django - 将我的代码发布到 github 会影响我的应用程序的安全性吗?

php - 有没有更好的方法来对抗 SQL 注入(inject)?

php - 如何防止 PHP 中的 SQL 注入(inject)?

performance - 应该将 search_data tsvector 存储在同一张表还是外部表中?