我可以使用这样的函数
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)保护,但对其的调用却没有。
解决方案
- 使用占位符(显而易见的选择:最安全的解决方案。)
确保
someUserInput
被正确引用- 使用客户端库引用它,如
PQescapeLiteral
- 使用第二次运行服务器来引用它
quote_literal
(无论如何都需要占位符)。选择 quote_literal($1);
- 使用客户端库引用它,如
我不会尝试自己创建引用机制。
关于postgresql - 我可以通过将 SQL 封装在 PostgreSQL 函数中来防止 SQL 注入(inject)攻击吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48013801/