PostgresSQL - SQL 准备语句与字符串转义防止 SQL 注入攻击

PostgresSQL - SQL Prepared Statement vs String Escaping preventing SQL injection attacks

您好,我正在编写一个使用 libpqxx 将行插入 Postgres SQL Table 的 C++ 应用程序,并且正在写入的数据是用户输入的,因此我需要防范 SQL注入攻击。根据我在网上看到的,我可以采取两种方法:

  1. 准备好的语句
std::string name_str = "Bob";            \! User input unsafe!!
std::string email_str = "bob@gmail.com"; \! User input unsafe!!

pqxx::connection con(c_string);

std::string insert_str = "INSERT INTO users(name, email) VALUES (, )";
con.prepare("insert_to_users", insert_str);

pqxx::work insert_work(con);

insert_work.exec_prepared("insert_to_users", name_str, email_str)
  1. 字符串转义
std::string name_str = "Bob";            \! User input unsafe!!
std::string email_str = "bob@gmail.com"; \! User input unsafe!!

pqxx::connection con(c_string);
pqxx::work insert_work(con);

std::string insert_str = "INSERT INTO users(name, email)"
                          "VALUES ('" + insert_work.esc(name_str) + "' , '" + insert_work.esc(email_str) + "')";

insert_work.exec(insert_str)

我的应用程序不会使数据库连接保持活动状态,因此准备好的语句只会被使用一次然后被销毁,那么使用准备好的语句是否过分了?

字符串转义是否提供针对所有 SQL 注入漏洞的保护?或者有更好的方法吗?

My application isn't going to keep the database connection alive therefore the prepared statement is only ever going to be used once

如果您担心性能,您应该解决这个一次性连接问题。而且,如果您不担心性能,那么为什么要关心准备好的语句是否 "over-kill"?

虽然两者都应该有效,但第一个更干净,并且将来不太可能有人搞砸。