使用libpq / libpqxx输入清理

时间:2012-08-08 16:45:48

标签: c++ libpq libpqxx

我刚刚开始为PostgreSQL数据库实现一些客户端软件。

查询将允许来自不受信任来源的输入参数。因此,我需要在实际提交之前清理我的交易。

至于lib​​pq,我发现了PQescapeStringConn,这可能是我想要的。但是,由于我的代码将用C ++编写,我更喜欢使用libpqxx等价物。我找不到任何相关的东西。 (可能是Escaper,但它位于内部命名空间中......)

我很感激关于最佳做法,阅读,文档链接等的任何建议。

2 个答案:

答案 0 :(得分:1)

使用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; --'

供参考:

答案 1 :(得分:0)

实际上,为了提供更好的视图,本周我对这种事情有疑问,我们开始使用 std :: string pqxx :: transaction_base :: esc

您只需要在要插入或更新的参数中添加它,即可完成工作。 上面提到的quote函数,将引号添加到参数中,但不能解决问题。

例如;如果您执行类似UPDATE的操作,则将人员设置名称设置为w.quote(name),其中id = 1; 您在此处正确使用了引号,以便将引数放在引号之间。 因此,为了插入单引号或避免SQL注入,您必须执行以下操作: UPDATE人员集名称= +“'” + w.esc(name)+“'”,其中id = 1或 UPDATE人员集名称= w.quote(w.esc(name)),其中id = 1; pqxx :: work变量已被W初始化,并且已经通过与数据库的连接进行了初始化。