我可以使用这样的函数
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
的论点受到保护,不受喷射的保护,但呼吁不是。
解决方案
- 使用占位符(显而易见的选择:大多数故障安全和安全解决方案。)
确保正确引用
someUserInput
- 使用客户library用
PQescapeLiteral
之类的东西引用它 - 使用第二次运行到服务器用
quote_literal
引用它(无论如何需要占位符)。SELECT quote_literal($1);
- 使用客户library用
我不会尝试创建引用机构。