我可以通过在 PostgreSQL 函数中包装 SQL 来防止 SQL 注入攻击吗?
Can I protect against SQL injection attacks by wrapping SQL in PostgreSQL functions?
我可以使用这样的函数吗
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()`, [someUserInput])
问题(利用)
client.query(`select create_user(${someUserInput})`
问题是
let someUserInput = `'foo'); DROP DATABASE bar;`;
这将发送到您的电话,
client.query("select create_user('foo'); DROP DATABASE bar;")`
而且,那会很糟糕。是的,create_user
的参数受到了注入保护,但对其的调用却没有。
解决方案
- 使用占位符(显而易见的选择:最安全可靠的解决方案。)
确保 someUserInput
被正确引用
- 使用 client-library 来引用
PQescapeLiteral
- 使用第二个 运行 服务器用
quote_literal
引用它(无论如何都需要占位符)。 SELECT quote_literal();
我不会尝试自己创建 quoting-mechanism。
我可以使用这样的函数吗
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()`, [someUserInput])
问题(利用)
client.query(`select create_user(${someUserInput})`
问题是
let someUserInput = `'foo'); DROP DATABASE bar;`;
这将发送到您的电话,
client.query("select create_user('foo'); DROP DATABASE bar;")`
而且,那会很糟糕。是的,create_user
的参数受到了注入保护,但对其的调用却没有。
解决方案
- 使用占位符(显而易见的选择:最安全可靠的解决方案。)
确保
someUserInput
被正确引用- 使用 client-library 来引用
PQescapeLiteral
- 使用第二个 运行 服务器用
quote_literal
引用它(无论如何都需要占位符)。SELECT quote_literal();
- 使用 client-library 来引用
我不会尝试自己创建 quoting-mechanism。