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将单引号加倍,你应该没问题.阅读你的问题的评论,听起来这个系统反对"'; - "攻击.:)