SQL注入是Web应用最常见的安全威胁之一。作为IT工程师,我将提供一套在Linux服务器上保护Web接口免受SQL注入攻击的全面解决方案。
// PHP PDO示例
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email AND status=:status');
$stmt->execute([
'email' => $email,
'status' => $status
]);
# Python SQLite示例
cursor.execute("SELECT * FROM users WHERE username = ? AND password = ?", (username, password))
# 安装PHP过滤扩展
sudo apt-get install php-filter
// 验证电子邮件格式
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
die("Invalid email format");
}
// 过滤特殊字符
$username = filter_var($_POST['username'], FILTER_SANITIZE_STRING);
# /etc/nginx/nginx.conf 或站点配置文件中
server {
# 阻止常见SQL注入模式
if ($query_string ~* "union.*select.*\(") {
return 403;
}
if ($query_string ~* "concat.*\(") {
return 403;
}
# 限制HTTP方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 405;
}
}
# /etc/apache2/conf-available/security.conf
<IfModule mod_security2.c>
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess On
# SQL注入防护规则
SecRule ARGS "@detectSQLi" "id:1000,phase:2,log,deny,status:403"
</IfModule>
-- 创建仅具有必要权限的数据库用户
CREATE USER 'webuser'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT SELECT, INSERT, UPDATE ON mydb.users TO 'webuser'@'localhost';
REVOKE DROP, ALTER, CREATE, GRANT OPTION FROM 'webuser'@'localhost';
# MySQL审计插件安装
sudo apt-get install mysql-server-audit
-- 启用审计
INSTALL PLUGIN audit_log SONAME 'audit_log.so';
SET GLOBAL audit_log_policy = 'ALL';
# Ubuntu安装
sudo apt-get install libapache2-mod-security2
sudo mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
# 启用OWASP核心规则集
sudo git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /etc/modsecurity/crs/
sudo cp /etc/modsecurity/crs/crs-setup.conf.example /etc/modsecurity/crs/crs-setup.conf
# 安装Fail2Ban
sudo apt-get install fail2ban
# 创建自定义过滤器
sudo nano /etc/fail2ban/filter.d/sqli-attack.conf
[Definition]
failregex = ^<HOST>.*sql.*injection
ignoreregex =
# 创建jail配置
sudo nano /etc/fail2ban/jail.local
[sqli-attack]
enabled = true
port = http,https
filter = sqli-attack
logpath = /var/log/apache2/access.log
maxretry = 3
bantime = 86400
# 安装sqlmap用于测试(仅用于安全测试)
sudo apt-get install sqlmap
# 定期扫描示例(应在测试环境执行)
sqlmap -u "http://yoursite.com/login" --forms --batch --crawl=2
# 安装并配置ELK堆栈
sudo apt-get install elasticsearch logstash kibana
# 创建Logstash SQL注入检测配置
input {
file {
path => "/var/log/apache2/access.log"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
if [message] =~ /union.*select|select.*from|insert.*into|delete.*from/ {
mutate { add_tag => ["sql_injection_attempt"] }
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
}
}
通过实施以上多层防御策略,您的Linux服务器上的Web接口将能有效抵御绝大多数SQL注入攻击。记得定期更新所有软件组件并持续监控安全日志,以应对新出现的威胁。