我可以通过将SQL包裹在PostgreSQL功能中来防止SQL注入攻击



我可以使用这样的函数

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})...`

还是我仍然需要与占位符一起使用参数化查询

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

问题(exploit)

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. 使用客户library用 PQescapeLiteral
    2. 之类的东西引用它
    3. 使用第二次运行到服务器用quote_literal引用它(无论如何需要占位符)。SELECT quote_literal($1);

我不会尝试创建引用机构。

最新更新