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

QF0*_*QF0 4 sql sqlite sql-injection

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

小智 6

基本上,你唯一需要担心的是单引号.查询中单引号中包含的任何内容都可以,但单个引号可以结束字符串,允许其余数据条目作为代码运行.如果sqlPrintf将单引号加倍,你应该没问题.阅读你的问题的评论,听起来这个系统反对"'; - "攻击.:)