2

PostgreSQLデータベース用のクライアントソフトウェアの実装を始めたばかりです。

クエリは、信頼できないソースからの入力パラメータを許可します。したがって、実際にコミットする前に、トランザクションをサニタイズする必要があります。

libpqに関しては、私はPQescapeStringConnを見つけました、それは私が必要とするかもしれません。ただし、私のコードはC ++で記述されるため、同等のlibpqxxを使用することをお勧めします。関連するものは見つかりませんでした。(おそらく内部名前空間にあるEscaperを除いて...)

ベストプラクティス、読書、ドキュメントへのリンクなどに関する提案をいただければ幸いです

4

2 に答える 2

3

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

参考のために:

于 2012-08-09T08:15:53.143 に答える
0

実際、より良いビューを提供するために、今週はこの種の問題が発生し、 std :: string pqxx :: transaction_base::escを使い始めました。

挿入または更新する引数に追加するだけで、その役割を果たします。そこに記載されているquote関数は、引数にquoteを追加しますが、問題は修正されません。

例えば; UPDATEのようなことをした場合personsetname = w.quote(name)where id = 1; そこでは、引用符の間に引数を置くために引用符を正しく使用しています。したがって、一重引用符を挿入するか、SQLインジェクションを回避するには、次のようにする必要があります。UPDATE person set name = + "'" + w.esc(name)+ "'" where id = 1 OR UPDATE person set name=w。 quote(w.esc(name))ここで、id = 1; Wであるため、pqxx :: work変数は、データベースへの接続ですでに初期化されています。

于 2019-03-26T11:13:34.327 に答える