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

时间:2017-12-28 20:13:03

标签: 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注入攻击?然后我可以在客户端上运行它,

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

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

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

1 个答案:

答案 0 :(得分:3)

问题(利用)

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. 使用客户端库引用类似PQescapeLiteral
    2. 的引用
    3. 使用第二次运行服务器以quote_literal引用它(无论如何都需要占位符)。 SELECT quote_literal($1);
  3. 我不会尝试自己创建引用机制。