【问题标题】:PostgresSQL - SQL Prepared Statement vs String Escaping preventing SQL injection attacksPostgresQL - SQL 准备语句与字符串转义防止 SQL 注入攻击
【发布时间】:2020-09-28 17:54:34
【问题描述】:

您好,我正在编写一个使用 libpqxx 将行插入 Postgres SQL 表的 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 ($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)
  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 注入漏洞的保护?还是有更好的方法?

【问题讨论】:

  • 您的标题已包含 SQL 注入攻击。答案就在这里。字符串转义可防止不需要的字符在数据库中结束,但无法防止 SQL 注入,即 SQL 引擎错误地将查询的结尾解释为不同的查询。只是谷歌搜索它立即给出了很好的例子here
  • @SergeBallesta 可以将其解释为不同查询的唯一方法是,如果它一开始就没有正确转义。

标签: c++ postgresql libpq libpqxx


【解决方案1】:

我的应用程序不会让数据库连接保持活动状态,因此准备好的语句只会被使用一次

如果您担心性能问题,您应该解决这个一次性连接问题。如果您不担心性能,那么您为什么要关心准备好的语句是否“过度杀伤”?

虽然任何一个都可以,但第一个更干净,而且将来有人搞砸的可能性更小。

【讨论】:

    猜你喜欢
    • 2012-01-05
    • 2012-06-19
    • 2018-07-05
    • 1970-01-01
    • 2015-09-06
    • 2010-12-21
    • 2011-09-26
    相关资源
    最近更新 更多