如果我有一个变量:
char *sql;
sql = "insert into Norm1Tab values (?,?,?,?,?,?)";
我想用存储在其他?
或char
变量中的值替换每个char*
。我怎么能用C ++做到这一点?
答案 0 :(得分:8)
在C ++中,不要使用char*
C风格的字符串。如果您使用std::string
,则可以使用find
和replace
来执行您想要的操作。
但请不要这样做。你只需打开一百万次SQL注入攻击。使用带有绑定参数的预准备语句。
答案 1 :(得分:1)
如果您正在使用sqlite(确定看起来像这样),您不必自己替换字符串。请改用sqlite3_bind_*
。
使用数据库提供程序中的API有很多好处,所以如果可以提供帮助,你真的不应该避免使用它们。您将获得更好的类型安全性,更好的注射防护以及更好的性能。
否则,我会使用boost::format
。
std::string sql = "insert into Norm1Tab values ('%1%','%2%');";
boost::format fmt(sql);
std::string stmt = boost::str( fmt % param1 % param2 );
正如其他人所说,你需要清理你的params以确保没有任何注射漏洞。
如果不这样做,任何有特殊字符的东西都可以破坏它。
char const* param1 = "Joe's House";
需要一些结构知识来摧毁它。只要有人看到Joe's House
的错误消息,他们就会知道他们可能会做得更糟。
char const* param1 = "'); DROP Norm1Tab; --";
如果你持续这样做,那么聪明人才能拥有完整的架构只是时间问题。例如,使用sqlite,对查询的任何注入都可以获得您以任何他们想要的方式安静地修改记录所需的所有信息。
SELECT * FROM sqlite_master;
答案 2 :(得分:0)
您可以放置%s并使用sprintf填充字段...
但是,对于手头的问题,您可能需要准备好的声明......
答案 3 :(得分:0)
如果你坚持这样做(而不是使用Matteo Italia的第一条评论),请查看此处的解决方案:
How do I Search/Find and Replace in a standard string?
这不是你需要的,但它显示了如何使用.find()来获取问号的位置,并使用.replace将问号替换为你的字符缓冲区的内容。