【发布时间】:2020-09-28 17:54:34
【问题描述】:
您好,我正在编写一个使用 libpqxx 将行插入 Postgres SQL 表的 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 ($1, $2)";
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 注入漏洞的保护?还是有更好的方法?
【问题讨论】:
-
您的标题已包含 SQL 注入攻击。答案就在这里。字符串转义可防止不需要的字符在数据库中结束,但无法防止 SQL 注入,即 SQL 引擎错误地将查询的结尾解释为不同的查询。只是谷歌搜索它立即给出了很好的例子here
-
@SergeBallesta 可以将其解释为不同查询的唯一方法是,如果它一开始就没有正确转义。
标签: c++ postgresql libpq libpqxx