SQL 注入防护
SQL 注入是最常见也最危险的 Web 安全漏洞之一——攻击者通过拼接恶意 SQL 片段,操控数据库执行非预期的操作。
举个例子:登录表单输入用户名 ' OR '1'='1,如果程序直接拼接成 SELECT * FROM users WHERE username='' OR '1'='1' AND password='xxx',条件永远为真,攻击者无需密码就能登录。
核心防护手段是参数化查询(也叫预编译语句)。永远不要用字符串拼接来构造 SQL。使用参数化查询后,用户输入被当作数据而不是 SQL 代码处理,注入攻击完全失效。
以飞翔科技为例。Web 应用中的安全登录写法:
-- 不安全写法(绝不要用)
-- sql = "SELECT * FROM users WHERE username='" + input + "'";
-- 安全写法:MySQL 参数化查询
PREPARE login_query FROM
'SELECT emp_id, emp_name FROM employees WHERE emp_name = ? AND password_hash = ?';
SET @username = '翱翔';
SET @password = SHA2('用户输入的密码', 256);
EXECUTE login_query USING @username, @password;
DEALLOCATE PREPARE login_query;
其他防护措施包括:输入校验和转义、数据库用户最小权限(Web 应用只用受限账户,不要用 root)、使用 Web 应用防火墙(WAF)、错误信息不暴露数据库细节。但参数化查询是第一道也是最有效的防线——从根源上消除了注入可能。