我刚刚开始为 PostgreSQL 数据库实现一些客户端软件。
查询将允许来自不受信任来源的输入参数。因此,我需要在实际提交之前对我的交易进行清理。
至于 libpq 我找到了 PQescapeStringConn,这可能确实需要我需要。但是,由于我的代码将用 C++ 编写,因此我更喜欢使用 libpqxx 等价物。我找不到任何相关的东西。(可能除了Escaper,它位于内部命名空间中......)
对于最佳实践、阅读、文档链接等方面的任何建议,我将不胜感激。
我刚刚开始为 PostgreSQL 数据库实现一些客户端软件。
查询将允许来自不受信任来源的输入参数。因此,我需要在实际提交之前对我的交易进行清理。
至于 libpq 我找到了 PQescapeStringConn,这可能确实需要我需要。但是,由于我的代码将用 C++ 编写,因此我更喜欢使用 libpqxx 等价物。我找不到任何相关的东西。(可能除了Escaper,它位于内部命名空间中......)
对于最佳实践、阅读、文档链接等方面的任何建议,我将不胜感激。
使用pqxx::transaction_base::quote是要走的路。
这是一个简单的例子:
// connection to the database
std::string login_str = "TODO: add credentials";
pqxx::connection conn(login_str);
pqxx::work txn(conn);
// a potentially dangerous input string
std::string input = "blah'; drop table persons; --";
// no proper escaping is used
std::string sql_1 = "select * from persons where lastname = '%s'";
std::cout << boost::format(sql_1) % input << std::endl;
// this is how it's done
std::string sql_2 = "select * from persons where lastname = %s";
std::cout << boost::format(sql_2) % txn.quote(input) << std::endl;
输出是:
select * from persons where lastname = 'blah'; drop table persons; --'
select * from persons where lastname = 'blah''; drop table persons; --'
以供参考:
实际上,为了提供更好的视角,本周我遇到了此类问题,我们开始使用std::string pqxx::transaction_base::esc
您只需将它添加到要插入或更新的参数中,它就可以完成这项工作。上面提到的引用函数,它将引用添加到参数中,但它不能解决问题。
例如; 如果您执行 UPDATE person set name = w.quote(name) where id = 1; 在那里,您正确地使用了引号,以便将参数放在引号之间。因此,为了插入单引号或避免 SQL 注入,您必须执行以下操作:UPDATE person set name = + "'" + w.esc(name) + "'" where id = 1 OR UPDATE person set name = w。报价(w.esc(名称)),其中 id = 1;作为 W,pqxx::work 变量已经通过与数据库的连接进行了初始化。