SQL注入攻击是Web应用中最普遍的安全漏洞之一,攻击者通过在输入框、URL参数等位置插入恶意SQL代码片段,绕过网站验证逻辑直接操作数据库,可能造成数据泄露、数据篡改甚至整个网站被控制。使用宝塔面板搭建的网站如果未做好防护,很容易成为这类攻击的目标。

SQL注入攻击的常见场景
常见的SQL注入触发位置包括用户登录框、搜索框、商品筛选参数、文章ID参数等,比如攻击者可能在登录账号输入框输入admin' OR 1=1 --,如果网站后端未对输入做过滤,就会拼接出恒为真的SQL语句,直接绕过密码验证登录管理员账号。
还有通过URL参数注入的情况,比如原本的URL是/article.php?id=1,攻击者修改为/article.php?id=1 UNION SELECT username,password FROM admin --,如果网站未过滤UNION等关键字,就可能直接返回管理员账号密码数据。
宝塔面板防火墙基础配置
宝塔面板内置了Web应用防火墙(WAF)功能,默认已经开启部分基础防护,但默认的SQL关键字拦截规则可能不够严格,需要手动调整配置。
开启宝塔面板防火墙
首先登录宝塔面板后台,在左侧导航栏找到安全选项,进入安全页面后,找到防火墙模块,确认防火墙状态为已开启,如果未开启点击开启按钮即可。
配置严格的SQL关键字拦截规则
在防火墙页面切换到规则列表标签,找到SQL注入相关的规则分组,默认的规则可能只拦截部分常见关键字,我们需要添加更严格的拦截项:
- 点击添加规则按钮,规则类型选择SQL注入
- 匹配位置选择全部(包含GET、POST、COOKIE等所有请求位置)
- 匹配关键字添加以下严格规则:
SELECT,FROM,WHERE,UNION,INSERT,UPDATE,DELETE,DROP,ALTER,OR,AND,--,#,/*,*/,' - 动作选择拦截,返回提示可以设置为请求包含非法内容,已被拦截
- 规则优先级设置为最高,确保优先匹配该规则
添加完成后点击保存,规则会立即生效。以下是添加规则的示例操作代码片段,展示规则配置的核心逻辑:
<?php
// 宝塔防火墙SQL注入规则配置示例逻辑
$sql_keywords = array(
'SELECT', 'FROM', 'WHERE', 'UNION', 'INSERT', 'UPDATE',
'DELETE', 'DROP', 'ALTER', 'OR', 'AND', '--', '#', '/*', '*/', "'"
);
// 获取用户请求参数
$request_params = array_merge($_GET, $_POST, $_COOKIE);
foreach ($request_params as $key => $value) {
// 遍历参数检查是否包含SQL关键字
foreach ($sql_keywords as $keyword) {
if (stripos($value, $keyword) !== false) {
// 命中关键字则拦截请求
header('HTTP/1.1 403 Forbidden');
echo '请求包含非法内容,已被拦截';
exit;
}
}
}
?>
其他辅助防护措施
仅开启防火墙关键字拦截还不够,还需要配合其他措施提升防护效果:
网站代码层过滤
在网站后端代码中,对所有用户输入的参数做转义处理,比如使用PHP的mysqli_real_escape_string函数,或者使用预处理语句执行SQL,避免直接拼接用户输入到SQL语句中。
预处理语句示例:
<?php
// 使用预处理语句避免SQL注入
$conn = new mysqli('localhost', 'db_user', 'db_pass', 'db_name');
// 检查连接
if ($conn->connect_error) {
die('连接失败: ' . $conn->connect_error);
}
// 预处理SQL语句
$stmt = $conn->prepare('SELECT * FROM users WHERE username = ? AND password = ?');
// 绑定参数
$stmt->bind_param('ss', $username, $password);
// 设置参数并执行
$username = $_POST['username'];
$password = md5($_POST['password']);
$stmt->execute();
// 获取结果
$result = $stmt->get_result();
?>
定期更新宝塔面板和网站程序
宝塔面板会定期推送安全更新,修复已知的防火墙漏洞,需要及时点击更新。同时网站使用的CMS、插件等也需要定期更新到最新版本,避免因为程序本身漏洞导致SQL注入攻击成功。
限制数据库权限
网站连接数据库使用的账号不要授予过高的权限,比如只授予SELECT、INSERT等必要权限,不要授予DROP、ALTER等高危权限,即使攻击者成功注入,也无法执行删除表、修改表结构等危险操作。
拦截效果验证
配置完成后可以手动测试拦截效果,在网站任意输入框输入test' OR 1=1 --提交,或者在URL后添加?id=1 UNION SELECT 1,2,如果页面返回拦截提示,说明规则已经生效。
如果正常请求也被拦截,可能是关键字规则过于严格,比如把正常的单引号也拦截了,这时候可以调整规则,把单引号从拦截列表移除,改为在代码层做转义处理,平衡安全性和可用性。