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

问题描述 投票:2回答:1

我可以使用这样的功能吗?

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])
postgresql security sql-injection quoting
1个回答
3
投票

Problem (exploit)

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

问题是如果发生了什么

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

这将被发送到您的电话,因为,

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

而且,那会很糟糕。是的,create_user的论点是针对注射的,但是对此的呼吁并非如此。

Solutions

  1. 使用占位符(显而易见的选择:大多数故障安全和安全解决方案。)
  2. 确保正确引用someUserInput 使用客户端库引用类似PQescapeLiteral的引用 使用第二次运行服务器来引用quote_literal(无论如何都需要占位符)。 SELECT quote_literal($1);

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

© www.soinside.com 2019 - 2024. All rights reserved.