我可以通过在 PostgreSQL 函数中包装 SQL 来防止 SQL 注入攻击吗?

Can I protect against SQL injection attacks by wrapping SQL in PostgreSQL functions?

我可以使用这样的函数吗

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

在服务器上防止SQL 注入攻击?然后我可以在客户端 运行 这个,

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

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

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

问题(利用)

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

问题是

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

这将发送到您的电话,

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

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

解决方案

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

    1. 使用 client-library 来引用 PQescapeLiteral
    2. 使用第二个 运行 服务器用 quote_literal 引用它(无论如何都需要占位符)。 SELECT quote_literal();

我不会尝试自己创建 quoting-mechanism。