我希望得到一些有关此方案针对 SQL 注入攻击的安全性的反馈。
在前端,用户输入个人信息:姓名、地址、电话号码、电子邮件和一些自由格式文本。
后端是用C++从头开始编码的,没有框架支持,并集成了SQLite。
C++代码是这样的not使用 SQLite 准备好的语句(由于历史原因,现在采取任何措施都为时已晚)。相反,所有 SQL 语句都被构造为 printf 样式的格式字符串,大致如下:
#define STATEMENT_N "UPDATE members SET FirstName='%s', Surname='%s', DOB='%s', etc"
实际的语句是通过手工编码创建的sprintf
(sqlPrintf
) 语句仅处理%s
, %c
, and %d
转换。然后创建最终的语句,如下所示:
sqlPrintf(query_buffer, STATEMENT_N, user_str_1, user_str_2, etc)
因此,换句话说(如果您不熟悉 C/sprintf),用户输入将被“打印”到%s
, %c
, and %d
。唯一不明显的处理sqlPrintf
是用户提供的单引号字符被转义(它们被加倍)。
这足以防止 SQL 注入攻击吗? “准备好的声明”实际上比上述方案更重要吗?