PostgresSQL - SQL 准备语句与字符串转义防止 SQL 注入攻击
PostgresSQL - SQL Prepared Statement vs String Escaping preventing SQL injection attacks
您好,我正在编写一个使用 libpqxx 将行插入 Postgres SQL Table 的 C++ 应用程序,并且正在写入的数据是用户输入的,因此我需要防范 SQL注入攻击。根据我在网上看到的,我可以采取两种方法:
- 准备好的语句
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)
- 字符串转义
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"?
虽然两者都应该有效,但第一个更干净,并且将来不太可能有人搞砸。
您好,我正在编写一个使用 libpqxx 将行插入 Postgres SQL Table 的 C++ 应用程序,并且正在写入的数据是用户输入的,因此我需要防范 SQL注入攻击。根据我在网上看到的,我可以采取两种方法:
- 准备好的语句
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)
- 字符串转义
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"?
虽然两者都应该有效,但第一个更干净,并且将来不太可能有人搞砸。