在Ubuntu上防范MySQL SQL注入可从应用层、数据库层及系统层多维度入手,核心措施如下:
应用层:使用预处理语句
通过PDO或MySQLi扩展以参数化查询传递用户输入,避免SQL拼接。
// PDO示例
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username');
$stmt->execute(['username' => $inputUsername]);
// MySQLi示例
$mysqli = new mysqli('localhost', 'user', 'password', 'test');
$stmt = $mysqli->prepare('SELECT * FROM users WHERE email = ?');
$stmt->bind_param('s', $inputEmail);
$stmt->execute();
应用层:输入验证与过滤
对用户输入进行格式校验(如邮箱、手机号正则匹配),过滤特殊字符。
// 正则验证邮箱
if (!preg_match('/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/', $inputEmail)) {
die('非法邮箱格式');
}
数据库层:权限最小化
为应用创建专用数据库用户,仅授予必要权限(如SELECT
、INSERT
),禁止GRANT ALL
。
CREATE USER 'app_user'@'localhost' IDENTIFIED BY '强密码';
GRANT SELECT, INSERT ON testdb.* TO 'app_user'@'localhost';
FLUSH PRIVILEGES;
数据库层:启用安全配置
在my.cnf
中设置sql_mode=STRICT_ALL_TABLES
,禁止不安全的SQL语法。
系统层:部署Web应用防火墙(WAF)
使用ModSecurity等工具拦截恶意SQL请求,可集成到Nginx/Apache中。
审计与监控
启用MySQL审计日志记录所有SQL操作,定期分析异常行为。
-- 安装审计插件(需先下载)
INSTALL PLUGIN audit_log SONAME 'audit_log.so';
SET GLOBAL audit_log_policy = 'ALL';
系统层:定期更新与补丁管理
通过apt-get update
和apt-get upgrade
保持MySQL及系统最新,修复已知漏洞。
关键优先级:预处理语句是防御SQL注入的核心技术,需在所有动态查询中强制使用;权限控制与WAF可作为辅助手段增强整体安全性。