小编QF0*_*QF0的帖子

在没有预处理语句/ SQLite/C++的情况下防止SQL注入

我很感激有关这个方案对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注入攻击吗?并且"准备好的声明"实际上比上述方案更重要吗?

sql sqlite sql-injection

4
推荐指数
1
解决办法
4657
查看次数

Perl 一行:替换中的捕获组被解释为八进制

假设我有一个包含文本的文件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 代表,所以我无法滚动错误的编辑。

bash perl

1
推荐指数
1
解决办法
212
查看次数

如何通过引用从原始指针创建 unique_ptr?

我正在调用一个库函数,它返回一个指向类对象的原始指针,但我想将返回的指针包装在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)

c++ smart-pointers

-1
推荐指数
1
解决办法
235
查看次数

标签 统计

bash ×1

c++ ×1

perl ×1

smart-pointers ×1

sql ×1

sql-injection ×1

sqlite ×1