我很感激有关这个方案对SQL注入攻击的安全性的一些反馈.
在前端,用户输入个人信息:姓名,地址,电话号码,电子邮件和一些自由格式文本.
后端在C++中从头开始编码,没有框架支持,并集成了SQLite.
C++代码也没有使用SQLite预处理语句(由于历史原因,它是来不及做任何事情).相反,所有SQL语句都构造为printf样式的格式字符串,沿着这些方向:
#define STATEMENT_N "UPDATE members SET FirstName='%s', Surname='%s', DOB='%s', etc"
Run Code Online (Sandbox Code Playgroud)
实际的语句用手工编码创建sprintf(sqlPrintf其中只处理)语句%s,%c和%d转换.然后创建最终语句,如:
sqlPrintf(query_buffer, STATEMENT_N, user_str_1, user_str_2, etc)
Run Code Online (Sandbox Code Playgroud)
因此,换句话说,(如果你不熟悉C/sprintf的),用户输入"印刷"到%s,%c和%d.唯一不明显的处理sqlPrintf是用户提供的单引号字符被转义(它们被加倍).
这足以防止SQL注入攻击吗?并且"准备好的声明"实际上比上述方案更重要吗?
假设我有一个包含文本的文件foo_bar_baz,并且我想将其替换为foo_bar_1234(这是更复杂问题的简化版本)。
第一次尝试:
$ echo "foo_bar_baz" > testfile
$ perl -pi -e "s/(foo_)(bar_).*/\1\2 1234/" testfile
$ cat testfile
foo_bar_ 1234
Run Code Online (Sandbox Code Playgroud)
所以,我只需要去掉 之前的空格即可1234。显而易见的答案是
$ perl -pi -e "s/(foo_)(bar_).*/\1\21234/" testfile
Run Code Online (Sandbox Code Playgroud)
...但这行不通。替换\212中包含八进制字符。我该如何解决?这里简要介绍了八进制问题,但我似乎错过了答案。该文档指出“Perl 通过将 \10 解释为反向引用来解决这种歧义,前提是在它之前至少有 10 个左括号”,但这里显然不是这种情况。此外,使用\g2or 并\g{2}不能解决问题。
我使用的是 Perl 5.34.0,bash 5.1.16。
编辑
该问题已被另一位用户回滚至修订版 3,但对该问题没有任何理解。最初的问题只有在 Perl 单行代码从 bash 脚本执行的上下文中才有意义;问题只是 Bash 和 Perl 之间对变量扩展的不同解释,以及单引号或双引号的使用。我没有 2K 代表,所以我无法滚动错误的编辑。
我正在调用一个库函数,它返回一个指向类对象的原始指针,但我想将返回的指针包装在unique_ptr. 我不知道库如何创建指针,但我假设它使用new(请参阅下面代码中的注释)。
下面的代码是创建unique_ptr并通过函数调用引用返回它的有效方法吗?该代码确实打印“42”,但是有更好的方法吗?
该库是 MariaDB C++ 连接器。不幸的是,它的文档很少。几天前我在SO上询问过这个问题,但到目前为止还没有得到答复。我本来会使用 MySQL 版本,但似乎并没有好多少。但是,有一个示例程序,其中包含以下行main:
std::unique_ptr<sql::Connection> conn(driver->connect(url, properties));
Run Code Online (Sandbox Code Playgroud)
因此,在阅读了评论和答案后,我想我现在可以假设Connection我想要的对象已被new编辑。另一方面,为什么我通过引用传递而不是仅仅返回unique_ptr- 好问题。唯一的原因是该应用程序中的所有其他代码都返回 abool作为成功状态,因此我认为在这里执行相同的操作会更加一致。
原始代码:
#include <memory>
#include <iostream>
class A {
public:
int b;
A() : b(42) {}
};
void create(std::unique_ptr<A> &p) {
A *a = new A; // this is actually a function call which returns an A*
p.reset(a);
}
int main() {
std::unique_ptr<A> foo;
create(foo); …Run Code Online (Sandbox Code Playgroud)