SQL Injection Prevention 是一个面向开发者的安全技能,用于在任意框架中检测并修复 SQL 注入漏洞。资料将其定位为马来西亚 PDPA 法院案例中的“发现 #1”,即最常见且最危险的漏洞。
核心规则
绝不将用户输入拼接进 SQL 字符串,始终使用参数化绑定。
检测模式
技能按技术栈列出了易受攻击与安全的写法对照。
Node.js / TypeScript:易受攻击的写法包括模板字符串注入(如 db.query(SELECT * FROM users WHERE id = '${userId}'))、字符串拼接(如 db.query("SELECT * FROM users WHERE name = '" + name + "'")),以及未正确转义的标签模板(如 db.raw(SELECT * FROM orders WHERE status = ${status}))。安全写法包括使用 ? 占位符并配合 .bind()、使用命名参数(如 db.query('SELECT * FROM users WHERE id = $1', [userId])),或使用自带转义的 ORM(如 prisma.user.findUnique)。
Cloudflare D1:易受攻击写法为 db.exec(INSERT INTO logs (msg) VALUES ('${userInput}'));安全写法为 db.prepare('INSERT INTO logs (msg) VALUES (?)').bind(userInput).run(),以及使用 db.batch 配合绑定参数执行多条语句。
Laravel / PHP:易受攻击写法包括 DB::raw("SELECT * FROM users WHERE email = '$email'")、DB::select("SELECT * FROM users WHERE id = " . $request->id)、$query->whereRaw("status = '$status'"),以及 orderByRaw 直接拼接请求参数。安全写法包括 DB::select('SELECT * FROM users WHERE email = ?', [$email])、$query->whereRaw('status = ?', [$status])、$query->orderByRaw('?? ??', [$sortColumn, $sortDirection]),以及使用 Eloquent(如 User::where('email', $email)->first())。
Python:易受攻击写法包括 cursor.execute(f"SELECT * FROM users WHERE id = {user_id}")、字符串拼接和 % 格式化。安全写法包括 cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))、命名参数 cursor.execute("SELECT * FROM users WHERE id = :id", {"id": user_id}),以及 Django ORM 的 User.objects.filter(id=user_id).first()。
搜索模式
审计代码库时,技能建议使用正则模式定位可疑代码,例如在 SELECT|INSERT|UPDATE|DELETE 附近查找包含 ${} 的模板字符串、在 query|execute|raw 附近查找字符串拼接、查找 .raw(.${、.exec(` 等;Laravel 中查找 DB::raw(.$、whereRaw(.$、orderByRaw(.$、->select(DB::raw(.$;Python 中查找 execute(f"、execute("." +、execute(".*%s" %。
修复流程
- 查找所有数据库查询位置,搜索 query/prepare/execute/raw 调用。
- 逐一检查是否使用 ? 占位符或字符串插值。
- 将插值替换为绑定,把 ${var} 换成 ? 并添加 .bind(var)。
- 运行现有测试验证查询仍可正常工作。
- 添加集成测试,验证恶意输入被安全处理。
法律后果
资料提及 PDPA 2010(2024 年修订)第 5(1) 和 5(2) 条:最高罚款 1,000,000 马来西亚林吉特、最高监禁 3 年,或两者并罚。SQL 注入是对疏忽系统进行数字取证分析时的头号发现。
适用场景与限制
该技能适用于需要对代码库进行 SQL 注入审计与修复的开发、安全场景,覆盖 Node.js、Cloudflare D1、Laravel/PHP、Python 等。资料未提供安装命令、具体平台支持范围、收费方式或效果保证等信息。