Excel VBA连接MySQL安全实战:彻底杜绝SQL注入
- 2026-09-20 07:51:28
问:为什么说字符串拼接的SQL语句存在严重安全隐患?如何用参数化查询保护你的数据库?
答: 很多人写VBA操作MySQL时习惯用字符串拼接SQL,这就像把家门钥匙挂在门外——黑客只需在输入框里输入一段特殊字符,就能篡改你的SQL逻辑,甚至删除整个数据库。下面用一个真实案例演示攻击过程,并手把手教你用参数化查询筑牢防线。
一、SQL注入攻击演示(触目惊心)
假设我们有一个登录窗口,用户输入用户名和密码后,VBA拼接如下SQL:
sql = "SELECT * FROM users WHERE username='" & txtUser & "' AND password='" & txtPass & "'"
正常输入:admin / 123456
→ SQL:SELECT * FROM users WHERE username='admin' AND password='123456'
恶意输入:用户名输入 admin' -- ,密码随便填
→ SQL变成:SELECT * FROM users WHERE username='admin' --' AND password='xxx'
由于--是MySQL注释符,后面的密码验证被完全忽略,直接返回admin用户的信息,攻击者无需密码即可登录!
更可怕的注入:用户名输入 '; DROP TABLE users; --
→ 整张表被删除!这就是SQL注入的威力。
二、我们的学生管理系统存在同样漏洞
回顾之前的增删改查代码,新增学生时用了:
sql = "INSERT INTO students VALUES (" & id & ",'" & name & "','" & cls & "'," & score & ")"
如果用户在姓名输入框中输入 小丽'); DELETE FROM students; --
则实际执行的SQL变成两条:
INSERT INTO students VALUES (4,'小丽'); DELETEFROM students; --',...)
第二条DELETE FROM students会清空整张表!所有数据瞬间丢失。
三、解决方案:参数化查询(Parameterized Query)
参数化查询的原理是:将SQL语句模板和数据分开传输。数据库引擎先编译SQL模板(占位符用?表示),再将参数值安全地传入,绝不会将参数当作SQL代码执行。即使参数中包含恶意字符,也会被转义成普通文本。
3.1 参数化查询的VBA标准写法
以查询操作为例,对比两种写法:
危险写法(字符串拼接):
Setrs= conn.Execute("SELECT * FROM students WHERE name LIKE '%" & keyword & "%'")
安全写法(参数化):
Dim cmd As Object, rs As ObjectSet cmd = CreateObject("ADODB.Command")cmd.ActiveConnection = conncmd.CommandText = "SELECT * FROM students WHERE name LIKE ?"' 创建参数对象:类型adVarChar(200),方向adParamInput(1),大小20,值Dim param As ObjectSet param = cmd.CreateParameter("@name", 200, 1, 20, "%" & keyword & "%")cmd.Parameters.Append paramSet rs = cmd.Execute关键点:
使用ADODB.Command对象而非直接conn.Execute
SQL中使用?占位符
通过CreateParameter指定参数类型、方向、大小和值
参数值中的特殊字符(如单引号、分号)会被自动转义